[英]C++ STL vector use too much memory
我书面方式使用的程序vector
等vector<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=full
在valgrind下运行程序。
使用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.