此代码导致我的内存泄漏,我不知道为什么。
[编辑]包含来自here的代码:
#include "src/base.cpp"
typedef std::map<std::string, AlObj*, std::less<std::string>,
gc_allocator<std::pair<const std::string, AlObj*> > > KWARG_TYPE;
AlInt::AlInt(int val) {
this->value = val;
this->setup();
}
// attrs is of type KWARG_TYPE
void AlInt::setup() {
this->attrs["__add__"] = new AddInts();
this->attrs["__sub__"] = new SubtractInts();
this->attrs["__mul__"] = new MultiplyInts();
this->attrs["__div__"] = new DivideInts();
this->attrs["__pow__"] = new PowerInts();
this->attrs["__str__"] = new PrintInt();
}
int main() {
while (true) {
AlObj* a = new AlInt(3);
}
}
AlInt继承自AlObj,后者继承自gc。当我注释掉setup()的内容然后我没有内存泄漏,这让我相信问题是地图没有清理,但是我使用gc分配器,所以我不确定在哪里看下一个。想法?
答案 0 :(得分:4)
'gc allocator'正在分配和处理这种类型的对象:
std::pair<const std::string, AlObj*>
只是因为这个对象中有一个指针并不意味着分配器会在其上调用delete。
如果您希望在setUp()中创建的对象是GC,那么您需要通过GC分配它们。或者学习使用boost:ptr_map或shared_ptr。
地图会破坏(不删除)拥有的对象。在这种情况下,它拥有指针而不是指针指向的内容。因此,当地图被销毁时,它会释放与地图及其拥有的对象相关的所有内容(对于指针,这意味着它什么都不做)。
如果您有包含指针的地图(或其他容器)。您必须手动删除指针,否则会出现内存泄漏。或者,您可以使用boost :: ptr_map或包含share_ptr
的映射答案 1 :(得分:0)
基本上我所说的是,AlObj似乎被破坏了,但不是它的成员(因为它不会泄漏,除非我把东西放在attrs中)。
答案 2 :(得分:0)
分配器正在删除你的对。但是删除一对并不会删除恰好是指针对的成员。