C++ STL向量占用太多内存

C++ STL向量占用太多内存,c++,memory,stl,vector,C++,Memory,Stl,Vector,我在SDL程序中使用STL向量。它看起来是这样的:vectorvec;这将生成一个可以包含指向项目符号对象的指针的向量。当我运行我的程序时,我一次只添加一项:vec.push_back(new_bullet);(new_bullet是指向“new”bullet对象的指针。然后在下面的函数中,我使用以下命令擦除对象:vec.erase(…);vec.size()显示项目被正确推送和弹出。我正在运行Ubuntu9.10,系统监视器显示我的程序内存使用率正在缓慢增加。是我的程序还是我缺少的关于STL

我在SDL程序中使用STL向量。它看起来是这样的:vectorvec;这将生成一个可以包含指向项目符号对象的指针的向量。当我运行我的程序时,我一次只添加一项:vec.push_back(new_bullet);(new_bullet是指向“new”bullet对象的指针。然后在下面的函数中,我使用以下命令擦除对象:vec.erase(…);vec.size()显示项目被正确推送和弹出。我正在运行Ubuntu9.10,系统监视器显示我的程序内存使用率正在缓慢增加。是我的程序还是我缺少的关于STL vector的内容?

听起来你好像没有删除“子弹”从向量中删除对象。

听起来,在从向量中删除对象时,您并没有删除“bullet”对象。

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


在将项目符号从向量中取出后,您是否对其调用free()/delete?

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

在将项目符号从矢量中拉出后,当您处理完项目符号时,是否正在对其调用free()/delete?

erase()
只从向量中删除一个元素,如果该元素是指针,它不会删除指向该元素的内存。这是有意义的……想象一下,您有一个字符串文本的
向量,并且确实执行了
v.erase(i)
;您不能删除
常量字符*

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

erase()
只从向量中删除一个元素,如果该元素是指针,它不会删除指向该元素的内存。这是有意义的……想象一下,您有一个字符串文本的
向量,并且确实执行了
v.erase(i)
;您不能删除
常量字符*


但是,
erase()
将为删除的元素调用析构函数如果你感兴趣的话,你应该去看看
boost::shared\u ptr
,它实现了引用计数垃圾收集。

虽然我猜原始海报没有释放他的“弹出”指针(pop没有为你这么做),std::vector还有另一个“功能”这可能会使问题变得模糊。std::vector过度分配了空间,因此每次推回都不需要重新分配和复制现有内容。换句话说,vector使用的空间通常比.size()返回的空间大


如果你想让std::vector占用的空间不超过它容纳元素所需的空间,请看一看这个习语。如果你不断地操纵这个向量,这是没有用的,但一旦你加载了所有内容,它可以节省一些空间。

而我猜原始海报并没有释放他的“弹出”指针(pop不会为您这样做),std::vector还有另一个“特性”可能会使问题变得模糊。std::vector过度分配了空间,因此每次推送都不需要重新分配和复制现有内容。换句话说,vector使用的空间通常大于.size()返回的空间


如果你想让一个std::vector占用的空间不超过它容纳元素所需的空间,请看一看这个习语。如果你一直在操作这个向量,那么这个习语就没用了,但是一旦你加载了所有内容,它就可以节省一些空间。

std::list::end()
是一个O(1)列表中的元素需要O(n)时间。此外,问题不是关于内存碎片,而是关于增加内存使用。<代码>:ST:::():(代码)>是O(1)。列表中的元素需要O(n)时间。此外,问题不是关于内存碎片,而是关于增加内存使用。“指针对象”通常被称为智能指针。“指针对象”。通常被称为智能指针。如果您想存储指向对象的指针,我建议使用Boost指针容器库:这将使您从内存管理的负担中解脱出来。(目前,我怀疑您的向量是否非常安全,因为不能保证在向量破坏时循环并删除每个元素。)如果您想存储指向对象的指针,我建议使用Boost指针容器库:这样可以让您从内存管理的负担中解脱出来。(目前,我怀疑您的向量是否非常安全,因为您不能保证在向量破坏时循环并删除每个元素。)