试图删除指向派生对象的基指针时发生断言错误 在研究C++中继承的基础上,我发现一个用于多态行为的基类应该实现它的析构函数为虚拟< /COD> < /P>。

试图删除指向派生对象的基指针时发生断言错误 在研究C++中继承的基础上,我发现一个用于多态行为的基类应该实现它的析构函数为虚拟< /COD> < /P>。,c++,polymorphism,C++,Polymorphism,我原以为我了解如何很好地应用这一点,但我遇到了一个我不了解的小问题 给定以下代码: #include <iostream> struct Base { Base() { std::cout << "Base ctor called\n"; }; virtual ~Base() { std::cout << "Base dtor called\n"; }; }; struct Derived : Base { Derived() :

我原以为我了解如何很好地应用这一点,但我遇到了一个我不了解的小问题

给定以下代码:

#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;
}
但是,出现断言错误

如果
p_base
直接指向一个新的
Derived
对象,即
base*p_base=new-Derived(),则一切正常

这里有什么不同


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


你的问题与继承无关。即使是同一类的对象也会出现这种情况。

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


你的问题与继承无关。即使是同一类的对象也会出现这种情况。

delete
ing自动分配内存会调用未定义的行为。每
新增一个
删除
,不再删除;同样如此。所有新闻都应该与删除匹配。一个不能没有另一个。密切相关/重复。TL;DR:您可以删除指向自动分配的指针,但程序将无法安然无恙地生存。您只能
delete
使用
new
创建的对象
delete
自动分配内存调用未定义的行为。每
新增一个
删除
,不再删除;同样如此。所有新闻都应该与删除匹配。一个不能没有另一个。密切相关/重复。TL;DR:您可以删除指向自动分配的指针,但该程序将无法在体验中毫发无损。您只能
删除使用
新建
创建的
对象。谢谢。我假设
p_base
也会同时被删除,这样我就不用担心指针悬空了,对吗?
p_base
不会被删除,也不应该被删除。当作用域结束时,
p_base
不再存在。这与释放动态内存不同。@Jake你可能把术语弄混了。悬空指针是指当指针指向的内容从指针下面消失,指针指向无效内存时发生的情况。有时,这是因为指针被分配了一个自动变量,该变量随后超出了范围。你似乎担心内存泄漏。自动存储不能泄漏。编译器确保了这一点。谢谢。我假设
p_base
也会同时被删除,这样我就不用担心指针悬空了,对吗?
p_base
不会被删除,也不应该被删除。当作用域结束时,
p_base
不再存在。这与释放动态内存不同。@Jake你可能把术语弄混了。悬空指针是指当指针指向的内容从指针下面消失,指针指向无效内存时发生的情况。有时,这是因为指针被分配了一个自动变量,该变量随后超出了范围。你似乎担心内存泄漏。自动存储不能泄漏。编译器确保。
Base ctor called
Derived ctor called
Derived dtor called
Base dtor called