std :: string使用的空闲内存

时间:2012-06-11 11:02:54

标签: c++ linux stdstring

我的struct看起来像这样:

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

我有一个std::vector< queue_item_t >,其中包含许多来自数据库查询的内容。

处理每个项目时,将从磁盘读取文件,并将其内容放入content字符串成员中。处理该项目(解析content)并在字符串上执行.clear(),以免占用我的所有记忆。

但是,这似乎没有释放内存。我有数十万个项目正在处理中,最终,内存使用量将超出可用范围,并且应用程序被“内存不足”的Linux杀死。

如何释放这些字符串使用的内存?

4 个答案:

答案 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吗?