繁体   English   中英

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

[英]C++ STL vector use too much memory

我书面方式使用的程序vectorvector<Myclass* >该矢量的长度为约1000,并且我使用for循环,以保持推动大约200个新对象指针到载体中,并挑选其中的100擦除使用擦除()功能。 对于删除的每个对象,我都使用delete释放内存。 在析构函数的最后一行中,我使用sizeof(this)来检查内存是否已成功释放。 它总是返回0。

但是我在ubuntu上使用top命令来检查该过程的内存使用情况。 大约3400次迭代,它将使用89%的内存用于仅2GB的内存实验。 我猜这是因为Myclass对象释放的内存没有被某些方式重用,并且向量不断从OS请求内存。

有人对此有任何想法吗?

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

sizeof(this) 不确定您实际上想知道什么,但是sizeof是一个编译时构造,永远不能告诉您在运行时发生了什么。

但是我在ubuntu上使用top命令来检查该过程的内存使用情况。 大约3400次迭代,它将使用89%的内存用于仅2GB的内存实验。 我猜这是因为Myclass对象释放的内存没有被重用

可能是内存泄漏。 例如,这可能是造成这种情况的原因。 析构函数代码中的错误。

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

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

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

向量使用的内存不会比要求的多1.5到2倍(我认为大多数实现是1.5倍,但这可能不是标准的)。 另外,由于指针只有4到8个字节,因此指针向量通常不会占用太多空间,至少直到您进入数百万个项目为止。

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

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

我不认为这是在做您认为正在做的事情。

但是我在ubuntu上使用top命令来检查该过程的内存使用情况。 大约3400次迭代,它将使用89%的内存用于仅2GB的内存实验。 我猜这是因为Myclass对象释放的内存没有被某些方式重用,并且向量不断从OS请求内存。

听起来好像有内存泄漏。 我怀疑您没有像您想的那样删除内存,但是我们需要查看您的代码。 您的向量在其中有指针而不仅仅是对象本身有什么原因吗?

没有看到代码,我只能建议使用

std::vector<object>而不是std::vector<object*>

要么

boost::ptr_vector

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM