c++内存管理

c++ memory management

本文关键字:管理 内存 c++      更新时间:2023-10-16

这是删除long和new创建的对象的映射的好方法吗?

// 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);

当数据超出作用域时,它删除所有的value成员。
此外,对于算法,所有成员都作为对象(而不是指针)的引用返回,因此使用标准算法比使用std::map<std::string,>在使用前需要取消引用的地方。

有人可能会问,为什么要有一个指向int/long类型的指针映射?将值存储在映射中不是更容易吗?

是的,虽然更好的解决方案是使用智能指针而不是Object*,但这是另一个主题。

你可以把for的内容缩短为

{
   delete it->second;
}

delete null已定义,为noop

这是一个非常好的删除方式。

虽然你可以让你的生活更容易使用智能指针

这是一个好的开始。

一旦你删除了对象,你应该从映射中移除指针或者将其设置为NULL以避免悬空指针。编辑:当然,你也可以在完成后清除地图,就像你的例子所示。

当您将指针存储在任何标准容器中时,总是存在异常或某些代码错误导致内存泄漏的可能性。我建议使用boost指针容器。

是。不管什么可能被认为是设计或体系结构问题(例如,使用更智能的指针),使用该方法清除映射并不是不合理的。

一个附加条件:objects映射不应该被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(或boost::shared_ptr,如果你的编译器不支持c++ 0x智能指针),它的优点是,如果你的映射可以包含相同的指针不止一次,它将工作,并且你的对象不会被销毁,如果其他人仍然有一个指针指向他们。

boost::ptr_map也是一个选项,虽然我相信,像手动方法,将不能正常工作,如果映射包含相同的指针多次