【问题标题】:multiple inheritance destructor calling his own and parent destructor? c++多重继承析构函数调用他自己和父析构函数? C++
【发布时间】:2016-10-09 03:41:04
【问题描述】:

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

下面示例中的 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;
}

【问题讨论】:

  • Cs 的析构函数也必须调用 Bs 的构造函数,否则你的内存会被打乱……你为什么要阻止呢?从您的示例中,根本不清楚什么会搞砸,实际上这里什么都不会搞砸
  • 如果BC 的父级,那么当C 被销毁时,CB 部分也需要被销毁。
  • 我的意思是你自己声明了析构函数virtual。你不必这样做,但我不建议你这样做。
  • 您好,我正在尝试从派生类创建派生类。但是我不知道如何解决这个内存问题。 -- 您发布的代码中没有内存问题。请发布您说的实际代码有内存问题。 C++ 做的是正确的事情。
  • 抱歉,好像我太不准确了,并且对析构函数调用有一个隧道视图..但我在上面扩展了我的帖子..但已经感谢所有答案@PaulMcKenzie

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


【解决方案1】:

恐怕答案是 C++ 在这里做的是正确的事情。如果这弄乱了你的记忆,做错事了。不幸的是,如果没有更多的上下文,很难判断你做错了什么。

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

【讨论】:

    猜你喜欢
    • 2012-11-14
    • 2011-04-04
    • 2012-04-28
    • 2011-12-27
    • 1970-01-01
    • 2017-07-09
    • 2011-12-31
    • 2011-10-14
    • 2013-09-06
    相关资源
    最近更新 更多