在研究C ++继承的同时,我了解到,用于多态行为的基类应将其析构函数实现为virtual
我以为我知道如何很好地应用此方法,但是遇到了一个我不理解的小问题。
给出以下代码:
#include <iostream>
struct Base
{
Base() { std::cout << "Base ctor called\n"; };
virtual ~Base() { std::cout << "Base dtor called\n"; };
};
struct Derived : Base
{
Derived() : Base() { std::cout << "Derived ctor called\n"; }
~Derived() { std::cout << "Derived dtor called\n"; };
};
int main()
{
Derived d;
Base *p_base = &d;
delete p_base; //Problem here?
return 0;
}
输出符合预期:
Base ctor called
Derived ctor called
Derived dtor called
Base dtor called
但是,发生_CrtisValidHeapPointer(block)
断言错误。
如果p_base
直接指向新的Derived
对象,即Base *p_base = new Derived();
这里有什么不同?
亲切的问候
答案 0 :(得分:2)
问题在于,在调用d
的情况下,本地构造的对象return 0
将在其作用域的结尾自动删除。但是到那时,您已经删除了指向同一对象的p_base
。因此,该对象被删除了两次。
您的问题与继承无关。即使是同一类的对象,它也应该出现。