您好我试图从派生类创建派生类。 但我不知道如何解决这个记忆问题。
以下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;
}
答案 0 :(得分:2)
我担心答案是C ++在这里做的正确。如果这会弄乱你的记忆,你做错了。不幸的是,没有更多的背景,很难说出你在做什么错误。
当C
继承自B
时,~B()
应销毁B
C
部分拥有的内存,而~C()
应该处理任何内容内存属于C
的一部分,但不属于B
。