gpt4 book ai didi

c++ - 使用字符串映射 vector C++ 时可能存在内存泄漏

转载 作者:行者123 更新时间:2023-12-02 00:36:16 25 4
gpt4 key购买 nike

我有一个非常复杂的数据对象,它使用字符串映射

typedef std::map<std::string, unsigned int> Event;
typedef std::pair<double, Event> EventGroup;
std::vector<EventGroup> eventVector;

这是一个始终在后台运行并监听传入消息的程序。每次出现一个新的 EventGroup( map 中可以有任意数量的字符串)时,我都会将其添加到 vector 中。

// New data came in
eventVector.push_back(newEventGroup);

我会时不时地删除这个 vector

//Flush some of the data because it's old
// it's been determined that the index to erase at is flushIndex
eventVector.erase(eventVector.begin(), eventVector.begin()+flushIndex);

通常这往往是数据的前 5%。

我注意到似乎存在内存泄漏。内存使用量开始时约为 50 MB...但最终接近 1 GB,然后速度太慢并崩溃。我听说删除操作的成本很高,但这可能是内存泄漏的原因吗?我是否缺少某种释放 map 使用的内存的方法?

最佳答案

如果不知道您的自定义类型的作用或外观(它们是否泄漏内存?),就很难说。但您应该注意,从 vector 中删除元素实际上并不会释放任何内存,它使 vector 已经分配的区域可用于添加到该 vector 的不同元素。换句话说, vector 的保留空间保持不变。

因此,如果您将 vector 增长到数百万个元素,删除其中 90%,并期望恢复大量内存,您会感到失望。释放 vector 保留的内存(在被销毁之前永远不会返回任何内容)的方法是执行交换习惯用法:

std::vector<EventGroup>(eventVector).swap(eventVector);

我不记得复制构造函数在这里如何工作的确切细节。它的行为应该与您执行此操作时完全相同:

std::vector<EventGroup>(eventVector.begin(), eventVector.end()).swap(eventVector);

您仍然无法控制它占用了多少空间,但是如果您释放了很多空间并且它将在很长一段时间内保持释放状态...这应该会将一些未知量的内存返回给系统。

请记住,这是一个昂贵的操作(这就是为什么 std::vector 不仅仅为您做这件事),因此仅在需要时才这样做。

关于c++ - 使用字符串映射 vector C++ 时可能存在内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10419860/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com