我的struct
看起来像这样:
struct queue_item_t {
int id;
int size;
std::string content;
};
我有一个std::vector< queue_item_t >
,其中包含许多来自数据库查询的内容。
处理每个项目时,将从磁盘读取文件,并将其内容放入content
字符串成员中。处理该项目(解析content
)并在字符串上执行.clear()
,以免占用我的所有记忆。
但是,这似乎没有释放内存。我有数十万个项目正在处理中,最终,内存使用量将超出可用范围,并且应用程序被“内存不足”的Linux杀死。
如何释放这些字符串使用的内存?
答案 0 :(得分:15)
std :: string和std :: vector不会在clear()中更改容器容量(=&gt;不释放容器内存)。无论何时需要压缩,都应使用下面的临时对象技巧(通常不需要)。
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);
某些字符串实现是copy-on-write。当从多个地方引用时,这样的字符串将在写入时重新分配内存。
答案 1 :(得分:1)
clear
不会释放所有字符串的内存(可能只是缓冲区)。它只是将字符串设置为空字符串。
如果您可以在字符串上调用clear
,为什么不重新使用它呢?因此,不要创建新的queue_item_t
,只需用新值替换其字符串成员。
答案 2 :(得分:1)
为了释放记忆,你可以做到:
my_queue_item.content = "";
my_queue_item.content.shrink_to_fit();
方法shrink_to_fit()
可以很好地释放内存并为my_queue_item.content
的新值分配足够小的空间(本例中为15个字节)。
答案 3 :(得分:0)
clear
可能无法释放内存。它将逻辑上将字符串设置为空字符串,但可能不会影响已分配的内存。
如果您要将更多数据读入同一queue_item_t
,则应替换之前的字符串内容。
您确定自己没有泄漏queue_item_t
吗?