기본 포인터가 있는 파생 객체 배열을 삭제[]하는 것이 정의되지 않은 동작인 이유는 무엇입니까?
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!