>  기사  >  백엔드 개발  >  C에서 정의되지 않은 동작으로 간주되는 기본 포인터를 사용하여 파생 개체 배열을 삭제하는 이유는 무엇입니까?

C에서 정의되지 않은 동작으로 간주되는 기본 포인터를 사용하여 파생 개체 배열을 삭제하는 이유는 무엇입니까?

Patricia Arquette
Patricia Arquette원래의
2024-11-01 03:42:02307검색

Why is deleting an array of derived objects with a base pointer considered Undefined Behavior in C  ?

기본 포인터가 있는 파생 객체 배열을 삭제[]하는 것이 정의되지 않은 동작인 이유는 무엇입니까?

C 표준 5.3.5 [ expr.delete]에는 "배열 삭제"의 경우 삭제할 개체의 동적 유형이 정적 유형과 다르면 정의되지 않은 동작이 발생한다고 명시되어 있습니다. 이는 다음 코드 조각이 정의되지 않은 동작을 호출한다는 것을 의미합니다.

<code class="cpp">struct B {
  virtual ~B() {}
};
struct D : B {};

B* p = new D[20];
delete [] p; // undefined behavior</code>

정의되지 않은 동작에 대한 이론적 근거

"삭제 []" 작업에는 첫 번째 요소에 대한 포인터가 필요합니다. 배열의. 그러나 파생 개체 배열에 대한 기본 포인터를 사용하는 경우 포인터는 실제로 첫 번째 요소의 기본 하위 개체를 참조합니다. 따라서 "삭제 []" 작업은 배열의 첫 번째 요소 대신 기본 하위 개체를 삭제하려고 시도하는 것이며 이는 잘못된 것입니다.

이 경우 올바른 동작을 적용하려면 배열의 요소 유형을 검색해야 합니다. 배열을 생성하고 해당 유형에 대해 Dynamic_cast를 수행합니다. 그러나 이렇게 하면 다형성을 사용하지 않는 경우에도 모든 다형성 배열에 불필요한 오버헤드가 발생합니다.

또한 포인터 "p" 자체는 기본 하위 개체만 가리키므로 사용이 제한됩니다. "p[i]"(i > 0인 경우)와 같은 일반적인 배열 연산은 불가능합니다.

결론

"delete []에 대한 정의되지 않은 동작 " 파생 개체 배열에 대한 기본 포인터를 사용하는 것은 다음과 같은 의식적인 설계 결정입니다.

  • 배열의 합법적인 사용을 위한 효율성 유지
  • 원하는 경우 다형성 배열 구현 허용
  • 파생 포인터를 사용한 잘못된 배열 연산 방지

위 내용은 C에서 정의되지 않은 동작으로 간주되는 기본 포인터를 사용하여 파생 개체 배열을 삭제하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.