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

时间:2011-11-07 02:51:24

标签: c++ memory vector

我正在编写一个使用vector的程序,例如vector<Myclass* > 这个向量的长度大约是1000,并且我使用for循环来继续将大约200个新对象指针推入向量并选择其中的100个来擦除使用erase()函数。 对于每个擦除的对象,我使用删除来释放内存。在析构函数的最后一行中,我使用 sizeof(this)来检查内存是否已成功释放。它总是返回0.

但我在ubuntu上使用top命令检查此进程的内存使用情况。大约3 400次迭代,它将使用89%的内存用于2GB内存实验室顶部。 我想这是因为Myclass对象释放的内存没有被重用,而且向量一直在向OS请求内存。

有人对此有任何想法吗?

6 个答案:

答案 0 :(得分:2)

  

在析构函数的最后一行中,我使用sizeof(this)来检查内存是否已成功释放。

sizeof(this)?不确定你真正想知道什么,但sizeof是一个编译时构造,永远不会告诉你在运行时发生的事情。

  

但我在ubuntu上使用top命令检查此进程的内存使用情况。大约3 400次迭代,它将使用89%的内存用于2GB内存实验室顶部。我想这是因为Myclass对象释放的内存没有被重用一些

可能你有内存泄漏。这可能是由例如造成的。由析构函数代码中的错误。

尝试使用--leak-check=fullvalgrind下运行您的程序。

答案 1 :(得分:2)

使用std::shared_ptr<object>而不是常规指针怎么样?

听起来你可能有内存泄漏。

答案 2 :(得分:1)

向量不会使用超过1.5x-2x的内存(我认为大多数实现都是1.5x,但这可能不是标准的)。此外,由于指针只有4到8个字节,因此指针向量通常不会占用太多空间,至少在你进入数百万个项目之前。

我很困惑你为什么要添加200个对象并在每个循环中删除100个对象。除非我误解你,否则堆上的对象数量将无限增长。在3400次迭代之后,每次添加100个对象,你将拥有300,000个对象,即使你没有内存泄漏(尽管听起来很可能),也可以很容易地为一个非平凡的类带来2 GB。

答案 3 :(得分:0)

  

在析构函数的最后一行中,我使用sizeof(this)来检查是否   内存已成功发布。它总是返回0.

我认为这不符合你的想法。

  

但我在ubuntu上使用top命令来检查内存的使用情况   这个流程。大约3 400次迭代,它将使用89%的内存   mey 2GB内存实验室顶部。我想这是因为释放的内存   从Myclass对象中没有被重用一些如何和向量   不断向操作系统询问内存。

听起来你有内存泄漏。我怀疑你没有像你认为的那样删除内存,但我们需要查看你的代码。是否有任何理由你的向量中有指针而不只是对象本身?

答案 4 :(得分:0)

没有看到代码,我可以建议使用

std::vector<object>代替std::vector<object*>

boost::ptr_vector

答案 5 :(得分:0)

  

在析构函数的最后一行中,我使用sizeof(this)来检查内存是否已成功释放。它总是返回0.

由于this是一个指针,sizeof(this)被评估(在编译时,一如既往)到指针的大小,在今天通常是4或8系统。此外,sizeof(something) 永远不会返回0。

如果您发布了一些代码,也许我们可以提供更好的建议。