当派生对象被销毁时,调用子析构函数和父析构函数是否存在任何问题?

Ye *_* Oo 2 c++ polymorphism inheritance memory-management segmentation-fault

如果我有以下两个课程:

#include <cstdlib>

class Parent
{
    protected:
        int* mem = (int*) std::malloc(5); // pointer to dynamically-stored object
    public:
        Parent() {};
        virtual ~Parent()
        {
            delete(mem);
        }
};

class Child: public Parent
{
    public:
        Child() {};
        ~Child()
        {
            delete(mem);
        }
};

int main(void)
{
    Child* c = new Child();
    delete(c);
}
Run Code Online (Sandbox Code Playgroud)

不应该打电话delete调用该类的实例Child导致分段错误,因为父级的析构函数也会在子级析构函数之后自动调用?如果是这样,解决方案是否是类Child只处理释放类“拥有”的动态分配的内存(即不在 的析构函数中Child删除并让其处理它)?memChildParent

我运行了我的 main 函数,并预计会发生分段错误,因为mem被释放了两次 - 一次在 的Child析构函数中,另一次在Parent析构函数中。没有发生错误,这让我感到惊讶。谁能解释一下为什么吗?

woh*_*tad 7

您的代码有两个问题:

  1. 分配的内存malloc应该用 with 释放free,而不是 with delete
  2. Child尝试释放未分配的内存。当Parent析构函数执行时,它将尝试释放已经由Child.

这两个问题都会导致 UB(未定义行为),这意味着任何事情都可能发生。