c++ - 尝试删除指向派生对象的基指针的断言错误
问题描述
在研究 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();
这里有什么不同?
亲切的问候
解决方案
问题是您的本地构造的对象d
将在其范围结束时自动删除,在您的情况下,当return 0
被调用时。但是那个时候,你已经删除p_base
了指向同一个对象的那个。因此该对象被删除两次。
您的问题与继承无关。即使是同一类的对象,它也应该出现。
推荐阅读
- c++ - 如何从 CGAL 中的表面网格中删除许多顶点?
- php - 正则表达式麻烦,捕获直到找到空间或结束行
- android - react-native 中 ios 和 android 平台的常见处理方式是什么?
- microservices - 在不引入性能问题的情况下解耦单体应用
- ios - 我们是否需要在释放之前为 UIControl 对象调用 removeTarget(_:action:for:) ?
- json - REST Api 在移动应用程序中返回 HTML 代码而不是 JSON 结果?
- javascript - 在 Python Flask 中单击按钮时不播放音频
- angular - 错误:模块“MaterialComponentsModule”导出的意外值“未定义”
- ios - Arkit 中的逆运动学
- javascript - 反应钩子错误:渲染的钩子比上一次渲染时更多