【发布时间】:2019-01-22 20:03:23
【问题描述】:
在研究 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();,则一切正常
这里有什么不同?
亲切的问候
【问题讨论】:
-
deleteing 自动分配的内存会调用未定义的行为。每个new一个delete,不多了;不少。 -
所有新闻都应该与删除相匹配。你不能没有另一个。
-
密切相关/重复Is it possible to delete a non-new object?。 TL;DR:您可以删除指向自动分配的指针,但程序将无法安然无恙。
-
您只能使用
delete使用new创建的对象。
标签: c++ polymorphism