gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 03:40:55 33 4
gpt4 key购买 nike

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

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

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com