gpt4 book ai didi

C++析构函数内存泄漏

转载 作者:太空狗 更新时间:2023-10-29 23:54:08 25 4
gpt4 key购买 nike

关于正确处理析构函数的相对简单的问题...

首先我有一个类似这样的类:

class Foo {
public:
ReleaseObjects() {
for (std::map<size_t, Object*>::iterator iter = objects.begin(); iter != objects.end(); iter++) {
delete (*iter).second;
}
objects.clear();
}

private:
std::map<size_t,Object*> objects;
}

因此该函数只是删除了使用“new”创建的对象。问题是一个对象类:

class Bar : public Object {
public:
Bar() {
baz = new Baz();
}

~Bar() { delete baz; }
private:
Baz* baz;
}

如果我将类型 Baz 对象添加到 Foo,然后尝试 ReleaseObjects(),我会发生内存泄漏 (valgrind)。问题指向 baz 被泄露,我猜这意味着 bar 中的析构函数从未被调用过?所以我想知道的是在试图销毁该对象时如何调用 Bar 析构函数(我不能改变 Bar 类,但我可以改变 Foo)。

编辑:糟糕,抱歉出现语法错误。无论如何,感谢所有回复,愚蠢的我忘了在我的 Baz 类中实现一个合适的析构函数!哦,Baz 实际上是一个模板类,但我认为 Baz 与我的问题有点无关,问题是 Bar 中的析构函数没有被调用……好吧,我错了,问题毕竟在 Baz 中。但再次感谢,我想我是从这里弄明白的!

最佳答案

您必须确保您的析构函数是虚拟的,以便调用正确的派生析构函数。

class Object {
. . .
virtual ~Object()
. . .
};

关于C++析构函数内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7811445/

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