Вектор STL занимает слишком много памяти - PullRequest
1 голос
/ 20 февраля 2010

Я использую вектор STL в моей программе SDL. и это выглядит так: vector vec; это делает вектор, который может содержать указатели на объекты Bullet. когда я запускаю свою программу, я добавляю только один элемент за раз, используя: vec.push_back (new_bullet); (new_bullet является указателем на «новый» объект Bullet. Затем в следующей функции я стираю объект с помощью: vec.erase (...); vec.size () показывает, что элементы перемещаются и выталкиваются правильно. I я использую Ubuntu 9.10, и System Monitor показывает, что объем используемой памяти моих программ медленно увеличивается. Это моя программа или что-то мне не хватает в векторном STL?

Ответы [ 4 ]

10 голосов
/ 20 февраля 2010

Звучит так, как будто вы не delete используете "пули" для объектов при удалении их из вектора.

3 голосов
/ 20 февраля 2010

erase() только удаляет элемент из вектора, но не удаляет указанную память, если этот элемент является указателем. Это имеет смысл ... представьте, что у вас есть vector<const char *> строковых литералов и вы сделали v.erase(i); Вы не можете удалить const char *!

Однако, erase() вызовет вызов деструктора для удаленного элемента. Таким образом, если вы используете своего рода «объект-указатель», а не указатель, он может освободить память при уничтожении. Если вам интересно, вы должны проверить boost::shared_ptr, который реализует сборку мусора с подсчетом ссылок.

0 голосов
/ 20 февраля 2010

Хотя я предполагаю, что оригинальный постер не освобождает свои «всплывающие» указатели (pop не делает этого за вас), std :: vector имеет еще одну «особенность», которая может скрыть проблему. std :: vector перераспределяет пространство так, что каждый push_back не влечет за собой перераспределение и копирование существующего содержимого. Другими словами, пространство, используемое для вектора, обычно больше, чем то, которое возвращает .size ().

Посмотрите на идиому shrink-to-fit , если вы хотите, чтобы std :: vector занимал не больше места, чем нужно для хранения его элементов. Бесполезно, если вы постоянно манипулируете вектором, но как только вы загрузите все, это может сэкономить место.

0 голосов
/ 20 февраля 2010

Если вы только добавляете в конец массива и беспокоитесь о фрагментации памяти, вы можете вместо этого использовать std::list. Единственная проблема заключается в том, что доступ к списку происходит в O (n) раз, если он не в начале.

Вы вызываете free () / delete для ваших пуль, когда закончите с ними после того, как вытащите их из вектора?

...