C ++ std :: map内存管理

时间:2014-04-07 21:14:45

标签: c++ memory-management map memory-leaks

我有以下C ++代码

map<long, TelemInfoV01> LastTelemetry;

void UpdateTelemetry( const TelemInfoV01 &info )
{
    LastTelemetry[info.mID] = info;
}

其中TelemInfoV01是结构

UpdateTelemetry方法在我的代码之外调用,传递一个值,我将其缓存并稍后使用。地图如何管理内存?它是否以相同的方式复制结构,从全局LastTelemetry映射中删除后是否必须手动删除它?

我不控制&#39;信息的范围。变量进入方法。我只想缓存它的价值,以便在另一个电话中使用它。

询问的主要原因是我有一些内存泄漏,并希望追踪它。

谢谢, 斯特沃

2 个答案:

答案 0 :(得分:2)

  

在我的代码之外调用UpdateTelemetry方法,传递一个   值,我稍后缓存和使用。地图如何管理内存?

map将保留自己的类实例副本,如果TelemInfoV01正确实现,那么你不必担心内存泄漏。如果你在其中分配了一些内存,那么你必须遵循rule of three以防止内存泄漏,但最好将指针放在智能指针中(所谓的rule of zero)。

  

是否以相同方式复制结构,是否必须手动删除它   从全局LastTelemetry地图中删除后?

你不必担心,在从map中删除struct之后,将在其上调用析构函数并将其正确销毁。因此,对于内存泄漏,你必须在struct构造函数中分配一些裸指针,然后忘记在析构函数中删除它。

如果你的缓存是一个全局变量,那么一旦你从main返回它就会被销毁。因此,如果检查内存泄漏是否为主端,则缓存可能看起来像是内存泄漏。

答案 1 :(得分:1)

:地图如何管理内存?

地图对管理内存没有任何特殊作用。

Q 是否以某种方式复制结构?

A 是的,确实如此。

operator[]的{​​{1}}函数定义如下:

map

表达式mapped_type& operator[] (const key_type& k); 的计算结果为LastTelemetry[info.mID]。这意味着行

TelemInfoV01&

类似于在LastTelemetry[info.mID] = info; 上调用赋值运算符(如TelemInfoV01)。 a = b;的副本存储在地图中。

从全局LastTelemetry地图中删除后,是否必须手动将其删除?

A 否。由于您的地图包含对象,因此在地图被破坏时会破坏它们。如果你选择存储指向info而不是对象的指针,你必须特别注意释放内存。