C++ 标准::映射内存管理
C++ std::map memory management
我有以下C++代码
map<long, TelemInfoV01> LastTelemetry;
void UpdateTelemetry( const TelemInfoV01 &info )
{
LastTelemetry[info.mID] = info;
}
其中 TelemInfoV01 是一个结构体
UpdateTelemetry 方法在我的代码外部调用,传递一个值,我稍后会缓存和使用。地图如何管理内存?它是否以相同的方式复制结构,从全局 LastTelemetry 映射中删除后是否必须手动删除它?
我不控制进入方法的"info"变量的范围。我只想缓存它的价值以在不同的调用中使用它。
询问的主要原因是我有一些内存泄漏,想追踪它。
谢谢斯蒂沃
在我的代码外部调用 UpdateTelemetry 方法,传递 值,我缓存并稍后使用。地图如何管理内存?
map将保留自己的类实例副本,如果TelemInfoV01正确实现,那么您不必担心内存泄漏。如果你在其中分配了一些内存,那么你必须遵循三规则以防止内存泄漏,但最好将指针放在智能指针中(所谓的零规则)。
是否以相同的方式复制结构,我是否必须手动删除它 从全球最新遥测地图中删除后?
您不必担心,从映射中删除结构后,将在其上调用析构函数,并且它将被正确销毁。因此,对于此处的内存泄漏,您必须在结构构造函数中分配一些裸指针,然后忘记在析构函数中删除它。
如果您的缓存是全局变量,那么一旦您从主节点返回,它就会被销毁。因此,如果您检查主端的内存泄漏,您的缓存可能看起来像内存泄漏。
问:地图如何管理内存?
映射不会执行任何特殊操作来管理内存。
问 它是否以某种方式复制结构?
答:是的,确实如此。
map
的operator[]
函数定义如下:
mapped_type& operator[] (const key_type& k);
表达式的计算结果LastTelemetry[info.mID]
为 TelemInfoV01&
。这意味着这条线
LastTelemetry[info.mID] = info;
类似于在TelemInfoV01
上调用赋值运算符(如 a = b;
)。info
的副本将存储在地图中。
问 从全局 LastTelemetry 映射中删除后,是否必须手动删除它?
答 否。由于您的地图包含对象,因此当地图被破坏时,它们会被破坏。如果您选择存储指向TelemInfoV01
的指针而不是对象,则必须格外小心地释放内存。
- 当vector是tje全局变量时,c++中vector的内存管理
- 当分配一个字符串值并稍后通过分配另一个值进行更改时C++如何管理内存?
- 我有一个线程 1:EXC_BAD_ACCESS(代码 = 1,地址 = 0x8)错误.我认为这是由于内存管理不好.我可以
- 可以通过非原始指针来增强容器矢量管理内存
- 如何使用 std::vector<std::tuple<A,B>> 来管理内存(调整大小、保留,...),但实际上将 As 保留在 B 之前,连续
- 线程管理内存泄漏
- 通过读取文件创建映射<字符串,矢量>时如何管理内存<string>
- 管理内存C++
- ptr_vector如何管理内存
- 在C++Builder/Firemonkey中使用表单创建来管理内存
- 如何正确管理内存(运行时)C++
- 在Node.js中使用Native Abstractions时,如何管理内存
- ostream是如何管理内存的
- C++中管理内存泄漏的问题
- OpenCL:在 CPU 上而不是在 GPU 上更正结果:如何正确管理内存
- deque是如何管理内存的
- 用c++/cli互操作管理内存
- 如何衡量管理内存所花费的时间
- (加速C++)章节管理内存
- 如何在此场景中管理内存