首页 > 解决方案 > 尝试删除指向派生对象的基指针的断言错误

问题描述

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

这里有什么不同?

亲切的问候

标签: c++polymorphism

解决方案


问题是您的本地构造的对象d将在其范围结束时自动删除,在您的情况下,当return 0被调用时。但是那个时候,你已经删除p_base了指向同一个对象的那个。因此该对象被删除两次。

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


推荐阅读