std :: string使用的空闲内存

Tho*_*ard 8 c++ linux stdstring

我有一个struct看起来像这样:

struct queue_item_t {
    int id;
    int size;
    std::string content;
};
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

bob*_*bah 15

std :: string和std :: vector不会在clear()中更改容器容量(=>不释放容器内存).只要需要压缩,就应该使用下面的临时对象技巧(通常不需要).

my_queue_item.content.clear(); // clear
std::string(my_queue_item.content).swap(my_queue_item.content); // compact
Run Code Online (Sandbox Code Playgroud)

当需要清理+压缩时,可以使上面的代码更简单:

std::string().swap(my_queue_item.content);
Run Code Online (Sandbox Code Playgroud)

一些字符串实现是copy-on-write.当从多个地方引用时,这样的字符串将在写入时重新分配存储器.

  • 并且C++ 11添加了一个`shrink_to_fit`成员函数,这是一个非绑定请求,要求实现做一些合理的事情. (7认同)
  • @Luchian:`clear`保证不会减少字符串的'capacity`,所以它几乎无法释放内存. (4认同)
  • [`std :: string().swap(my_queue_item.content);`有什么问题?(见ideone)](http://ideone.com/IYorg#view_edit_box) (4认同)
  • @stefanbachert C++ 11 FDIS:`21.4.4/15`说`clear();`等于`erase(begin(),end());`,它又在`21.4.6.5/中定义9`,字面上说:`删除[first,last)范围内的字符.这只修改了字符数组和`end()`的位置,而不是已经分配的内存. (3认同)