2014-04-07 50 views
1

我具有以下C++代码C++的std ::图存储器管理

map<long, TelemInfoV01> LastTelemetry; 

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

其中TelemInfoV01是一个结构

的UpdateTelemetry方法被称为我的代码以外,传递的值,该余缓存和使用后来。地图如何管理内存?它是否以相同的方式复制结构,从全局LastTelemetry映射中删除后是否必须手动删除它?

我不控制进入方法的'info'变量的范围。我只是想缓存它的价值在不同的调用中使用它。

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

感谢, 斯特沃

+6

该地图保留自己的键和值的副本。你不必担心任何事情。 – juanchopanza

+2

使用'valgrind'或'vld'来跟踪内存泄漏。否则,在任何地方使用原始指针都是一个很好的起点。 – OMGtechy

+0

确保'TelemInfoV01'在复制构建,复制分配和破坏时正确运行。 –

回答

2

的UpdateTelemetry方法被称为我的代码外,路过 值,我缓存,然后再使用。地图如何管理内存?

如果TelemInfoV01正确实现,那么地图将保留它自己的类实例副本,那么您不必担心内存泄漏。如果你在内部分配了一些内存,那么你必须遵循rule of three来防止内存泄漏,但是它仍然更好地将指针放在智能指针内(所谓的rule of zero)。

是它在复制同样的方式结构,我已经从全球LastTelemetry地图中删除后手动删除它 ?

你不必担心,你的结构被从地图中删除后,析构函数将被调用它,它会被正确销毁。所以,对于内存泄漏,您必须在struct构造函数中分配一些空指针,然后忘记在析构函数中删除它。

如果你的缓存是一个全局变量,那么一旦你从你的主体返回,它将被销毁。所以如果你检查内存泄漏的主要目的,你的缓存可能看起来像内存泄漏。

1

问题地图如何管理内存?

A map并没有做任何特殊的事情来管理内存。

Q它以某种方式复制结构?

A是的,它的确如此。

mapoperator[]函数被定义,如:

mapped_type& operator[] (const key_type& k); 

表达LastTelemetry[info.mID]计算结果为TelemInfoV01&。这意味着线

LastTelemetry[info.mID] = info; 

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

问题从全局LastTelemetry映射中删除后,是否必须手动删除它?

A不可以。因为你的地图保存着对象,所以当地图被破坏时它们会被破坏。如果您选择存储指向TelemInfoV01而不是对象的指针,则必须格外小心才能释放内存。