从映射中删除动态分配的内存

Deleting dynamically allocated memory from a map

本文关键字:内存 动态分配 删除 映射      更新时间:2023-10-16

我有一个动态分配对象的映射,想知道删除它们的最佳方法是什么?

我在想也许是一个互动者?像这样:

studentlist::const_iterator deletemem = studentmap.begin();
for(studentlist::const_iterator deletemem=studentmap.begin(); deletemem!=studentmap.end();++deletemem)
{
    Record *z=deletemem->second // Record is the type of object stored in the map student map
    delete z;
 }

但我不确定,任何帮助将不胜感激!

你的代码看起来不错。但是,手动删除可能不是异常安全的。您可以考虑使用share_ptr(来自 Boost 的那个,或者,如果您使用 C++0x,则为标准实现)作为值或使用 boost::ptr_map

编辑:要删除地图中的实际数据,请在删除所有内容后调用studentmap.clear()。这将从地图中移除所有元素。

编辑 2:例如,当由于异常而未调用清理代码时,会出现解决方案的问题。在这种情况下,您会泄漏内存。要克服这个问题,您可以使用 RAII 习语。上面描述了两种可能的方法。

更好的解决方案是将动态分配的内存封装在另一个堆栈分配的对象中。这可以是您自己的发明之一,也可以使用新C++标准或 boost 中的 shared_ptr 类。

你的代码应该可以工作,但你应该在最后清除studentmap

当然,您还必须使任何其他对象无效,这些对象应该包含您正在解除分配的指针的副本,否则您的应用程序可能会崩溃。