Base 클래스에 가상 소멸자 (예 : vtable 항목을 피하기 위해)가없고 Derived 클래스에 기본 속성 만 있으면 기본 클래스의 포인터가 true 인 경우 new로 할당 된 모든 메모리가 해제됩니다. 삭제 되었습니까? 파생 클래스의 소멸자가 호출되지 않을 것이지만 전체 객체에 의해 할당 된 메모리가 해제되는지 궁금합니다. Derived 포인터에서 delete를 호출하면 전체 메모리 공간을 비울 것이라고 가정합니다. 이 메모리의 파생 클래스 부분을 해제하지 않을 경우비 - 가상 소멸자 및 기본 클래스 포인터를 사용하여 전체 개체를 해제 할 수 있습니까?
또한, 어떻게을 무료로 얼마나 많은 메모리를 알고, 기본 클래스에 가상 소멸자의 같은 경우에 있지만 함께 작동합니까?
Exemple :
class Base {
public:
int a;
int b;
Base() {}
~Base() {}
};
class Derived : public Base {
public:
int c;
int d;
Derived() {}
~Derived() {}
};
int main() {
Base *p = new Derived();
delete p; // is memory allocated for Derived freed?
return 0;
}
올바르지 않습니다. 삭제 연산자는 주어진 유형에 따라 작동합니다. 이 경우'Base '를 삭제하려고 시도합니다. –
누락 된 부분은 가상 소멸자가 없기 때문에 정의되지 않은 동작이 발생합니다. –
강조된 문구 : 가상 소멸자가 있거나 동작이 정의되지 않았습니다. – SingleNegationElimination