由std :: string使用的空闲内存

我有一个像这样的struct

 struct queue_item_t { int id; int size; std::string content; }; 

我有一个std::vector< queue_item_t >这是从数据库查询填充这些许多这些。

处理每个项目时,将从磁盘读取文件,并将其内容放入contentstring成员中。 该项目被处理( 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吗?