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