2

这段代码对我造成了内存泄漏,我不知道为什么。

[编辑]此处包含的代码有问题:

#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,而 AlObj 又继承自 gc。当我注释掉 setup() 的内容时,我没有内存泄漏,这让我相信问题在于地图没有清理,但是我使用的是 gc 分配器,所以我不确定接下来看哪里。想法?

4

2 回答 2

4

'gc allocator' 正在分配和处理这种类型的对象:

std::pair<const std::string, AlObj*>

仅仅因为这个对象有一个指针并不意味着分配器会在它上面调用delete。

如果您希望在 setUp() 中创建的对象是 GC,那么您需要通过 GC 分配它们。或者学习使用 boost:ptr_map 或 shared_ptr。

地图销毁(而不是删除)它拥有的对象。在这种情况下,它拥有指针而不是指针指向的位置。因此,当地图被销毁时,它会释放与地图及其拥有的对象相关的所有内容(对于指针,这意味着它什么都不做)。

如果您有一个包含指针的地图(或其他容器)。您必须手动删除指针,否则会出现内存泄漏。或者,您可以使用 boost::ptr_map 或包含 share_ptr 的地图

于 2008-11-15T19:12:48.123 回答
0

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

于 2008-11-16T06:59:26.263 回答