STL矢量占用太多内存

时间:2010-02-20 01:50:10

标签: c++ memory stl vector

我在SDL程序中使用STL向量。它看起来像这样:vector< Bullet *> VEC;这使得一个向量可以包含指向Bullet对象的指针。当我运行我的程序时,我只使用一次添加一个项目:vec.push_back(new_bullet); (new_bullet是一个指向“新”Bullet对象的指针。然后在以下函数中我使用以下方法擦除对象:vec.erase(...); vec.size()显示正在推送和弹出项目.I运行Ubuntu 9.10和系统监视器显示我的程序内存使用量正在慢慢增加。是我的程序还是我对STL向量缺少的东西?

4 个答案:

答案 0 :(得分:10)

当您从矢量中删除它们时,听起来好像不是delete“子弹”对象。

答案 1 :(得分:3)

erase()仅从向量中移除元素,如果该元素是指针,则不会删除指向的内存。这是有道理的...想象你有一个vector<const char *>的字符串文字并且v.erase(i);你无法删除const char *

但是,erase() 调用已删除元素的析构函数。因此,如果您使用某种“指针对象”而不是指针,它可能会在销毁时释放内存。如果您有兴趣,可以查看实现引用计数垃圾收集的boost::shared_ptr

答案 2 :(得分:0)

如果您只是添加到数组的末尾并且您担心内存碎片,则可能需要使用std::list。唯一的问题是,列表访问是O(n)时间,如果它们不在开头。

你是否在将它们拉出矢量后完成对子弹的免费()/删除?

答案 3 :(得分:0)

虽然我猜测原始海报没有释放他的“弹出”指针(pop不会为你做这个),但std :: vector还有另一个“功能”可能会让它成为问题。 std :: vector overallocate space使得每个push_back都不需要重新分配和复制现有内容。换句话说,用于向量的空间通常大于.size()返回的空间。

如果您希望使std :: vector占用的空间不超过其保存元素所需的空间,请查看shrink-to-fit习语。如果您经常操作向量,则无用,但是一旦加载了所有内容,就可以节省一些空间。