Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;映射内存管理 我有以下C++代码< /P> map<long, TelemInfoV01> LastTelemetry; void UpdateTelemetry( const TelemInfoV01 &info ) { LastTelemetry[info.mID] = info; } 地图遥测; void updateelemetry(const TelemInfoV01&info) { LastTelemetry[info.mID]=信息; }_C++_Memory Management_Map_Memory Leaks - Fatal编程技术网

C++;映射内存管理 我有以下C++代码< /P> map<long, TelemInfoV01> LastTelemetry; void UpdateTelemetry( const TelemInfoV01 &info ) { LastTelemetry[info.mID] = info; } 地图遥测; void updateelemetry(const TelemInfoV01&info) { LastTelemetry[info.mID]=信息; }

C++;映射内存管理 我有以下C++代码< /P> map<long, TelemInfoV01> LastTelemetry; void UpdateTelemetry( const TelemInfoV01 &info ) { LastTelemetry[info.mID] = info; } 地图遥测; void updateelemetry(const TelemInfoV01&info) { LastTelemetry[info.mID]=信息; },c++,memory-management,map,memory-leaks,C++,Memory Management,Map,Memory Leaks,其中TelemInfoV01是一个结构 updateElemetry方法在我的代码之外调用,传递一个值,我缓存该值并在以后使用。地图如何管理内存?是否以相同的方式复制结构,从全局LastTelemetry映射中删除后是否必须手动删除 我不控制进入方法的'info'变量的范围。我只想缓存它的值,以便在不同的调用中使用它 问这个问题的主要原因是我有一些内存泄漏,我想找到它 谢谢, 斯特沃 updateElemetry方法在我的代码之外调用,传递 值,我将其缓存并稍后使用。地图如何管理内存 map将保

其中TelemInfoV01是一个结构

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

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

问这个问题的主要原因是我有一些内存泄漏,我想找到它

谢谢, 斯特沃

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

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

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

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


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

Q映射如何管理内存

映射不会对内存进行任何特殊管理

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

A是的

map
运算符[]
功能定义如下:

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

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

Q从全局LastTelemetry地图中删除后,我是否必须手动删除它


A否。由于地图包含对象,因此当地图被销毁时,对象将被销毁。如果选择存储指向
TelemInfoV01
的指针而不是对象,则必须格外小心才能释放内存。

映射保留自己的键和值副本。你不必担心任何事情。使用
valgrind
vld
之类的工具来追踪内存泄漏。否则,使用原始指针的任何地方都是一个良好的起点。确保
TelemInfoV01
在复制构造、复制分配和销毁时行为正常。