我有一个像这样的struct
:
struct queue_item_t { int id; int size; std::string content; };
我有一个std::vector< queue_item_t >
这是从数据库查询填充这些许多这些。
处理每个项目时,将从磁盘读取文件,并将其内容放入content
string成员中。 该项目被处理( content
被parsing),我执行.clear()
的string,以免吃掉我所有的记忆。
但是,这似乎并没有释放内存。 我有成千上万的项目正在处理,最终,内存的使用将超出可用的范围,并且Linux以“内存不足”为由杀死了应用程序。
如何释放这些string使用的内存?
std :: string和std :: vector不会在clear()中更改容器容量(=>不释放容器内存)。 每当需要压缩时(通常不需要),应该使用临时对象的下面的技巧。
my_queue_item.content.clear(); // clear std::string(my_queue_item.content).swap(my_queue_item.content); // compact
清理+压缩需要时,上面的代码可以变得更简单:
std::string().swap(my_queue_item.content);
一些字符串实现是写入时拷贝。 这样的字符串,当从多个地方引用时,会在写入时重新分配内存。
clear
不会释放字符串的所有内存(可能只是缓冲区)。 它只会将字符串设置为空。
如果你可以打电话clear
字符串,为什么不重用呢? 所以,而不是创建一个新的queue_item_t
,只需用新的值替换它的字符串成员。
释放记忆你可以做到:
my_queue_item.content = ""; my_queue_item.content.shrink_to_fit();
shrink_to_fit()
方法将很好地释放内存,并为my_queue_item.content
新值分配足够小的空间(本例为15个字节)。
clear
可能不会释放内存。 它将从逻辑上将字符串设置为空字符串,但可能不会影响已分配的内存。
如果您正在读取更多的数据到相同的queue_item_t
,它应该替换以前的字符串内容。
你确定自己没有泄漏queue_item_t
吗?