尝试删除指向派生对象的基本指针时出现断言错误

时间:2018-08-15 22:22:45

标签: c++ polymorphism

在研究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();

,则一切正常

这里有什么不同?

亲切的问候

1 个答案:

答案 0 :(得分:2)

问题在于,在调用d的情况下,本地构造的对象return 0将在其作用域的结尾自动删除。但是到那时,您已经删除了指向同一对象的p_base。因此,该对象被删除了两次。

您的问题与继承无关。即使是同一类的对象,它也应该出现。