使用Boehm GC时C ++中内存泄漏的原因

时间:2008-11-15 18:41:57

标签: c++ garbage-collection

此代码导致我的内存泄漏,我不知道为什么。

[编辑]包含来自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分配器,所以我不确定在哪里看下一个。想法?

3 个答案:

答案 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)

分配器正在删除你的对。但是删除一对并不会删除恰好是指针对的成员。