我有以下C ++代码
map<long, TelemInfoV01> LastTelemetry;
void UpdateTelemetry( const TelemInfoV01 &info )
{
LastTelemetry[info.mID] = info;
}
其中TelemInfoV01是结构
UpdateTelemetry方法在我的代码之外调用,传递一个值,我将其缓存并稍后使用。地图如何管理内存?它是否以相同的方式复制结构,从全局LastTelemetry映射中删除后是否必须手动删除它?
我不控制&#39;信息的范围。变量进入方法。我只想缓存它的价值,以便在另一个电话中使用它。
询问的主要原因是我有一些内存泄漏,并希望追踪它。
谢谢, 斯特沃
答案 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
而不是对象的指针,你必须特别注意释放内存。