> 백엔드 개발 > C++ > 본문

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

Susan Sarandon
풀어 주다: 2024-10-29 05:51:02
원래의
719명이 탐색했습니다.

 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!