【发布时间】:2021-06-08 20:10:38
【问题描述】:
我在一个名为 virtual.cpp 的文件中有这个简单的代码:
#include <iostream>
class Parent
{
public:
virtual ~Parent(){ std::cout << "Parent Destructor" << std::endl; }
virtual void VirtualFunction()
{
std::cout << "VirtualFunctionInParent" << std::endl;
}
};
class Child: public Parent
{
public:
virtual ~Child() { std::cout << "Child Destructor" << std::endl; }
virtual void VirtualFunction()
{
std::cout << "VirtualFunctionInChild" << std::endl;
}
};
int main()
{
Child child1;
Parent *parent1 = &child1;
delete parent1;
}
编译正确
g++ -Wall --pedantic -o virtual virtual.cpp
但是当我运行它时,我得到这个错误:
./virtual
Child Destructor
Parent Destructor
free(): invalid pointer
Annullato (core dump creato)
我认为是因为我删除了指针parent1,所以这会擦除指针指向的内存,即&child1。
因此,当 child1 超出范围时,Child 析构函数会尝试释放不再存在的内存。
我的问题:
- 我的推理正确吗?
- 如果我的推理是正确的,那么处理这种“超出范围”情况的正确方法是什么?
【问题讨论】:
-
只有
delete你new。 -
你会遇到同样的问题加上内存泄漏,因为
new Parent;的地址被覆盖并丢失了。 -
@vaeVictis 既然您已经得到了几个答案,我不建议您使用此空间提出新问题。如果需要,有一个 [ ] 按钮。
-
@vaeVictis -- 关键字
delete并不意味着“擦除”。其目的是通知分配器以前使用new分配的内存现在可以重用(如果需要)。实际上没有任何东西被“擦除”。 可能发生的是调试运行时将用一个值覆盖该区域,但这就是“擦除”的范围。 -
你会发现在不知道和使用正确术语的情况下很难与程序员讨论编程。
标签: c++ invalid-pointer