Причина утечки памяти в C ++ при использовании Boehm GC - PullRequest
2 голосов
/ 15 ноября 2008

Этот код вызывает у меня утечку памяти, и я не знаю, почему.

[РЕДАКТИРОВАТЬ] Включенный код от здесь в вопросе:

#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 allocator, поэтому я не уверен где искать дальше. Мысли?

Ответы [ 3 ]

4 голосов
/ 15 ноября 2008

'gc allocator' выделяет и присматривает за объектами этого типа:

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

То, что у этого объекта есть указатель, не означает, что распределитель вызовет для него удаление.

Если вы хотите, чтобы объект, созданный в setUp (), был GC, тогда вам нужно выделить их через GC. Или научитесь использовать boost: ptr_map или shared_ptr.

Карта уничтожает (не удаляет) объект, которому она владеет . В этом случае ему принадлежит указатель , а не , на который указывает указатель. Поэтому, когда карта уничтожена, она освобождает все, что связано с картой и принадлежащим ей объектом (для указателей это означает, что она ничего не делает).

Если у вас есть карта (или другой контейнер), которая содержит указатели. Вы должны вручную удалить указатели, иначе произойдет утечка памяти. В качестве альтернативы вы можете использовать boost :: ptr_map или карту, которая содержит share_ptr

0 голосов
/ 16 ноября 2008

Распределитель удаляет ваши пары. Но удаление пары не удаляет членов пары, которые оказались указателями.

0 голосов
/ 15 ноября 2008

По сути, я говорю, что AlObj, похоже, разрушен, но не его члены (так как он не протекает, если я не помещаю вещи в attrs).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...