>백엔드 개발 >C++ >C에서 기본 포인터 정의되지 않은 동작을 통해 파생 개체 배열을 삭제하는 이유는 무엇입니까?

C에서 기본 포인터 정의되지 않은 동작을 통해 파생 개체 배열을 삭제하는 이유는 무엇입니까?

Patricia Arquette
Patricia Arquette원래의
2024-10-30 07:31:27782검색

Why is Deleting an Array of Derived Objects via a Base Pointer Undefined Behavior in C  ?

기본 포인터를 통해 파생 객체 배열을 삭제하는 것이 정의되지 않은 이유

C에서 다음과 같은 경우 배열 삭제 동작이 정의되지 않습니다. 객체의 동적 유형은 정적 유형과 다릅니다. 이는 C 03 표준(5.3.5 [expr.delete] p3)에 설명되어 있습니다. "두 번째 대안(배열 삭제)에서 삭제할 개체의 동적 유형이 정적 유형과 다른 경우 동작은 정의되지 않습니다. ."

설명하기 위해 다음 코드 조각을 고려하십시오.

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

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

기본 포인터를 사용하여 파생 개체의 배열을 삭제하는 것이 직관적으로 보일 수 있지만 표준에서는 이를 정의되지 않은 동작으로 지정합니다. . 이는 기본 포인터 p가 첫 번째 요소 자체가 아닌 배열에 있는 첫 번째 요소의 기본 하위 개체를 가리키기 때문입니다.

배열의 다형성 삭제를 구현하려면 요소 유형을 검색하고 동적 형변환을 수행해야 합니다. 그런 다음 일반 삭제[]를 수행합니다. 그러나 이는 다형성을 활용하지 않는 경우에도 불필요한 오버헤드를 발생시킵니다.

따라서 정의되지 않은 동작과 불필요한 오버헤드를 방지하려면 배열이 다형성으로 동작할 수 없다는 점을 기억하는 것이 중요합니다. 대신, 다형성 동작이 필요한 경우 별도로 구현할 수 있습니다.

요약:

  • 적법한 사용에 대한 불이익을 피하기 위해 어레이는 다형성 동작을 지원하지 않습니다.
  • 필요한 경우 배열의 다형성 삭제를 별도로 구현할 수 있습니다.

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

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