[英]c++ memory management
这是删除 map 的好方法吗?
// iterate over the map
for (std::map<unsigned long, Object*>::iterator it = objects.begin(), it_end = objects.end(); it != it_end; ++it)
{
Object* temp = it->second;
if(temp)
delete temp;
}
// clear the map
objects.clear();
是的。 使用 boost::ptr_map
boost::ptr_map<std::string, BigObject> data;
data.insert("Plop", new BigObject);
当数据离开 scope 时,它会删除其所有value
成员。
同样对于算法,所有成员都作为对 object (不是指针)的引用返回,因此与标准算法一起使用比 std::map<std::string, BigObject*> 您需要取消引用要容易得多使用前的成员。
人们不得不质疑为什么你首先有一个指向 int/long 的 map 指针? 将值存储在 map 中不是更容易吗?
是的,虽然更好的解决方案是使用智能指针而不是Object*
,但这是一个不同的主题。
您可以将 for 的内容缩短为
{
delete it->second;
}
delete null
已定义并且是一个 noop。
这是一个非常好的删除方法。
尽管您可以使用智能指针让您的生活更轻松。
这是一个好的开始。
删除 object 后,应从 map 中删除指针或将其设置为 NULL 以避免悬空指针。 编辑:或者你当然可以在完成后清除 map,如示例所示。
当您将指针存储在任何标准容器中时,异常或某些代码错误总是有可能导致 memory 泄漏。 我建议将提升指针容器作为替代方案。
是的。 无论什么可能被视为设计或架构问题(例如,使用更智能的指针),使用该方法清除 map 并非不合理。
一个附带条件: objects
map 不应因 Object* 指针的破坏而改变。 如果是这样,最好使用这样的东西:
// iterate over the map
typedef std::map<unsigned long, Object*>::iterator map_iter;
for (map_iter it = objects.begin();
it != objects.end();
/* blank */ )
{
iter_map to_delete = it;
++it;
Object* temp = to_delete->second;
if(temp)
delete temp;
objects.delete(to_delete);
}
我建议使用智能指针,例如std::unique_ptr
(这是 C++0x 功能,并非所有编译器都支持它)。 例如:
std::map<unsigned long, std::unique_ptr<Object>> map;
// Do something with the map
map.clear(); // The objects are automatically deleted.
您还可以使用std::shared_ptr
(如果您的编译器不支持 C++0x 智能指针,则使用boost::shared_ptr
),其优点是如果您的 map 可以多次包含相同的指针,它将起作用,并且如果其他人仍然有指向它们的指针,您的对象将不会被销毁。
boost::ptr_map
也是一个选项,但我相信,如果 map 多次包含相同的指针,则与手动方法一样,它将无法正常工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.