【发布时间】:2012-06-11 11:02:53
【问题描述】:
我有一个struct,看起来像这样:
struct queue_item_t {
int id;
int size;
std::string content;
};
我有一个std::vector< queue_item_t >,其中填充了许多来自数据库查询的信息。
处理每个项目时,会从磁盘读取一个文件,并将其内容放入content 字符串成员中。该项目已处理(content 已解析),我在字符串上执行 .clear(),以免耗尽我所有的内存。
但是,这似乎并没有释放内存。我正在处理数十万个项目,最终,内存使用量将超过可用内存,并且应用程序被 Linux 杀死,原因是“内存不足”。
如何释放这些字符串使用的内存?
【问题讨论】:
-
你需要
content作为结构的成员吗?根据您的解释,听起来它只是非常简短地使用,因此临时可能更适合该任务。此外,为什么不使用std::queue而不是std::vector? -
您的结构被称为
queue_item_t的事实表明它们的向量代表某种队列。如果是这种情况,为什么不在处理完元素后从队列中删除它们呢?我问,因为它可能是您的问题的正确解决方法在于其他地方。销毁它们(以及它们的content字符串)是释放资源的一种非常可靠的方法!然后你只需要处理从向量的开头删除效率不高的事实 - 所以请改用deque,或者如果处理它们的顺序无关紧要,则以相反的顺序处理。跨度> -
@SanderDeDycker 我现在做的只是整个过程的第二部分;在正常操作下,从不从文件中读取数据,而是从互联网上检索数据,并将数据直接放在已下载的每个项目的
content字符串中。但你是对的,在不同的情况下,临时变量会更好。 -
如果对于队列中的每个项目,您检索内容,处理内容,然后丢弃它,那么检索和处理的确切方法无关紧要。内容(甚至项目)在处理后仍会被丢弃,因此似乎不需要将其存储在队列中 - 它可以作为函数参数或类似参数传递。如果我遗漏了什么,有代表性的代码示例可能会很有用。