我在一个名为的文件中有这个简单的代码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 析构函数尝试释放不再存在的内存。
我的问题:
- 我的推理正确吗?
- 如果我的推理是正确的,那么处理这种“超出范围”情况的正确方法是什么?