c++ - 多重继承析构函数调用他自己和父析构函数? C++

标签 c++ memory destructor multiple-inheritance virtual-destructor

您好,我正在尝试从派生类创建派生类。 但是我不知道如何解决这个内存问题。

下面示例中的 C 类同时调用了他自己的析构函数和 B 析构函数。 但这不是我想要的,因为它会打乱我的内存。

我应该使用另一种方法还是有解决方案?

class A {
public:
    virtual ~A() {}
};


class B : public A {
public:

    B() : A() {}
    virtual ~B() {std::cout << "B Destructor" << std::endl;}
};

class C : public B {

public:
    C() : B() {}
    ~C() {std::cout << "C Destructor" << std::endl;}
};

int main() {

    A *b = new B();
    A *c = new C();

    delete b;
    delete c;

    return 0;
}

输出:

 ./a.out
 B Destructor
 C Destructor
 B Destructor

//编辑 抱歉,好像我实际上发布了一个工作示例。 尽管如此,在我的真实代码中(但我实际上使用了上面示例中的模式:我得到了错误

labrob(5254,0x7fff77789000) malloc: * error for object 0x7fe3dbc00030: pointer being freed was not allocated * set a breakpoint in malloc_error_break to debug Abort trap: 6

当我删除 C 的析构函数时,我得到了内存泄漏 这个错误实际上只出现在使用 C 型机器人时

所以我有 3 种机器人,它们可以在运行时多次实例化并被推送到机器人列表中。

解决不同线程上的迷宫问题

最后我用迭代器从列表中删除机器人

在 valgrind 上它说正在释放大量内存 所以我认为 B 和 C 的析构函数调用导致了这一点。

在我的 main.cpp 中:

    // delete robots
    for (auto it = robots.begin(); it != robots.end(); ++it) {

        if(printSolution) std::cout << (*it)->solution() << std::endl;
        delete *it;

    }

    return 0;
}

最佳答案

恐怕答案是 C++ 在这里做了正确的事情。如果这打乱了你的内存,就做错了。不幸的是,如果没有更多的上下文,就很难说出你做错了什么。

C 继承自 B 时,~B() 应该销毁 B 部分拥有的内存C~C() 应该处理属于 C 但不属于 B 的任何内存.

关于c++ - 多重继承析构函数调用他自己和父析构函数? C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37709815/

相关文章:

c++ - Qt鼠标点击检测一直不工作

c - 传递 C 字符数组并分配导致程序崩溃

c# - 析构函数不能保证完成运行吗?

c++ - 使用 Concurrency::parallel_for() 的边际性能增益

c++ - 如何在没有尾随字节\x00 的情况下发送不同长度的消息?

Mysql 内存存储引擎可能的最大文本大小

javascript - 使用 `null` 分配对象是否会造成内存泄漏?

c++ - 快速成功退出 C++,并分配大量对象

c++ - 如果我知道我的函数不会抛出异常,我应该在析构函数中放置 try...catch block 吗

c++ - 从模板调用类保护方法