多继承析构函数调用自己的父析构函数? C ++

时间:2016-06-08 18:07:13

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

您好我试图从派生类创建派生类。 但我不知道如何解决这个记忆问题。

以下exmaple中的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: *对象0x7fe3dbc00030的错误:未释放指针被释放   * 在malloc_error_break中设置断点以进行调试   中止陷阱: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;
}

1 个答案:

答案 0 :(得分:2)

我担心答案是C ++在这里做的正确。如果这会弄乱你的记忆,做错了。不幸的是,没有更多的背景,很难说出你在做什么错误。

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

相关问题