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

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

Susan Sarandon
Susan Sarandon원래의
2024-10-29 05:51:02715검색

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

파생 객체가 있는 배열: 삭제의 함정[]

C 표준에서는 베이스를 사용하여 파생 객체의 배열을 삭제한다고 명시적으로 명시하고 있습니다. 포인터로 인해 정의되지 않은 동작이 발생합니다. 겉보기에 모호해 보이는 이 규칙은 그 근거와 잠재적 의미에 대한 의문을 제기했습니다.

이 개념을 이해하기 위해 정적 유형과 동적 유형의 차이점을 검토해 보겠습니다. 다음 코드 조각이 있다고 가정합니다.

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

B* p = new D();</code>

이 경우 p의 정적 유형은 B*이고 *p의 동적 유형은 D입니다. 이는 p가 유형의 하위 객체를 가리키기 때문입니다. B 객체 대신에 D를 생성한 것입니다.

그러나 기본 포인터를 사용하여 배열을 선언하면 미묘한 차이가 드러납니다. 다음 코드를 고려하세요.

<code class="cpp">B* p = new D[20];</code>

여기서 p는 첫 번째 요소 자체가 아니라 배열에 있는 첫 번째 요소의 기본 하위 개체를 가리킵니다. 따라서 delete [] p를 사용하면 배열의 정적 유형과 동적 유형이 일치해야 한다는 요구 사항을 위반합니다.

이 정의되지 않은 동작의 이유는 런타임 환경에 발생할 수 있는 잠재적인 비효율성과 복잡성에 있습니다. 기본 포인터를 사용하여 파생 개체의 배열을 올바르게 삭제하려면 구현 시 삭제를 수행하기 전에 배열의 요소 유형을 동적으로 검색하고 각 포인터를 올바른 유형으로 캐스팅해야 합니다. 특히 다형성 배열의 제한된 사용 사례를 고려할 때 이러한 오버헤드는 불필요한 것으로 간주됩니다.

또한 기본 포인터를 사용하여 파생 배열을 삭제하면 또 다른 문제가 발생합니다. p가 하위 개체를 가리키므로 배열 요소(예: i > 0인 경우 p[i])에 대한 후속 액세스는 잘못된 결과를 생성합니다. 이는 파생 객체 배열에 대한 기본 포인터와 함께 delete [] 사용에 대한 제한을 추가로 지원합니다.

결론적으로, 기본 포인터를 사용하여 파생 객체 배열을 삭제하는 정의되지 않은 동작은 고유한 복잡성과 부족함에서 비롯됩니다. 그것이 소개할 유틸리티의. 이 경우를 처리하는 특수한 delete []를 구현하는 것이 가능할 수도 있지만 C의 디자인 철학과 일치하지 않는 비용 성능과 유용성이 희생됩니다.

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

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