使用字符串C ++映射的向量时可能发生内存泄漏

时间:2012-05-02 18:48:47

标签: c++ string memory-leaks map vector

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

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

这是一个始终在后台运行的程序,用于侦听传入的消息。每当一个新的EventGroup进入时,它可以在地图中包含任意数量的字符串,我将它添加到向量中。

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

我会不时地对这个载体进行擦除

//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。我听说擦除操作是一项昂贵的操作,但这可能是导致内存泄漏的原因吗?我错过了一些释放地图使用的内存的方法吗?

1 个答案:

答案 0 :(得分:4)

不知道你的自定义类型做什么或看起来像什么(他们泄漏记忆?)很难说。但是,您应该注意,从向量中删除元素实际上并不释放任何内存,它使向量已经分配的区域可用于添加到THAT向量的不同元素。换句话说,向量的保留空间保持不变。

所以,如果你将一个向量增加到几百万个元素,删除它们中的90%,并期望得到一堆内存,你会感到失望。你可以释放一个向量所保留的内存的方式(在它被销毁之前永远不会回馈任何东西)是做交换成语的事情:

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

我不记得复制构造函数在这里工作的具体细节。它应该与您完成此操作完全相同:

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

你还无法控制它消耗了多少空间,但是如果你已经释放了很多空间并且它会在很长一段时间内保持释放......这应该会给你带来一些未知的内存量。系统

请记住,这是一项昂贵的操作(这就是为什么std :: vector不仅适合你),所以只在你需要时才这样做。

相关问题