C++ 标准::映射内存管理

C++ std::map memory management

本文关键字:管理 内存 映射 C++ 标准      更新时间:2023-10-16

我有以下C++代码

map<long, TelemInfoV01> LastTelemetry;
void UpdateTelemetry( const TelemInfoV01 &info )
{
    LastTelemetry[info.mID] = info;
}

其中 TelemInfoV01 是一个结构体

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

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

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

谢谢斯蒂沃

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

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

是否以相同的方式复制结构,我是否必须手动删除它 从全球最新遥测地图中删除后?

您不必担心,从映射中删除结构后,将在其上调用析构函数,并且它将被正确销毁。因此,对于此处的内存泄漏,您必须在结构构造函数中分配一些裸指针,然后忘记在析构函数中删除它。

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

:地图如何管理内存?

映射不会执行任何特殊操作来管理内存。

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

答:是的,确实如此。

mapoperator[]函数定义如下:

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

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

LastTelemetry[info.mID] = info;

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

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

否。由于您的地图包含对象,因此当地图被破坏时,它们会被破坏。如果您选择存储指向TelemInfoV01的指针而不是对象,则必须格外小心地释放内存。