试图删除指向派生对象的基指针时发生断言错误 在研究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