C++ c++;内存管理
这是一种删除由新对象生成的长对象和对象的映射的好方法吗C++ c++;内存管理,c++,memory,pointers,new-operator,C++,Memory,Pointers,New Operator,这是一种删除由新对象生成的长对象和对象的映射的好方法吗 // 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; } // cl
// 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();
//在地图上迭代
对于(std::map::iterator it=objects.begin(),it_end=objects.end();it!=it_end;++it)
{
对象*temp=it->second;
如果(临时)
删除临时文件;
}
//清除地图
对象。清除();
是的,虽然更好的解决方案是使用智能指针而不是对象*
,但这是一个不同的主题
您可以将for的内容缩短为
{
delete it->second;
}
delete null
已定义,是一个noop。是的,虽然更好的解决方案是使用智能指针而不是对象*
,但这是一个不同的主题
您可以将for的内容缩短为
{
delete it->second;
}
delete null
已定义,是noop。是。使用boost::ptr_映射
boost::ptr_map<std::string, BigObject> data;
data.insert("Plop", new BigObject);
boost::ptr_地图数据;
数据插入(“Plop”,新的BigObject);
当数据超出范围时,它将删除其所有值成员。
此外,对于算法,所有成员都作为对象的引用返回(而不是指针),因此与标准算法一起使用要比std::map容易得多,在std::map中,您需要在使用前取消对memebr的引用
人们首先会问,为什么有指向int/long的指针映射?仅仅在地图中存储值不是更容易吗?是的。使用boost::ptr_映射
boost::ptr_map<std::string, BigObject> data;
data.insert("Plop", new BigObject);
boost::ptr_地图数据;
数据插入(“Plop”,新的BigObject);
当数据超出范围时,它将删除其所有值成员。
此外,对于算法,所有成员都作为对象的引用返回(而不是指针),因此与标准算法一起使用要比std::map容易得多,在std::map中,您需要在使用前取消对memebr的引用
人们首先会问,为什么有指向int/long的指针映射?仅仅将值存储在映射中不是更容易吗?这是一种完美的删除方法
尽管使用智能指针可以让你的生活更轻松。这是一种完美的删除方式
尽管使用智能指针可以让你的生活更轻松。这是一个好的开始
删除对象后,应该从映射中删除指针或将其设置为NULL以避免指针悬空。编辑:当然,您也可以在完成后清除地图,如您的示例所示
当您将指针存储在任何标准容器中时,总是存在异常或某些代码错误导致内存泄漏的可能性。我建议另作选择。这是一个好的开始
删除对象后,应该从映射中删除指针或将其设置为NULL以避免指针悬空。编辑:当然,您也可以在完成后清除地图,如您的示例所示
当您将指针存储在任何标准容器中时,总是存在异常或某些代码错误导致内存泄漏的可能性。我建议另作选择。是的。不管什么可能被认为是设计或架构问题(例如,使用更智能的指针),使用该方法清除映射并不是不合理的
一个限制条件是:对象
映射不应该因为对象*指针的破坏而改变。如果是的话,最好使用以下内容:
// 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);
}
//在地图上迭代
typedef std::map::迭代器映射;
for(map_iter it=objects.begin();
it!=objects.end();
/*空白*/)
{
iter_映射到_delete=it;
++它;
对象*temp=要删除->秒;
如果(临时)
删除临时文件;
对象。删除(要删除);
}
是。不管什么可能被认为是设计或架构问题(例如,使用更智能的指针),使用该方法清除映射并不是不合理的
一个限制条件是:对象
映射不应该因为对象*指针的破坏而改变。如果是的话,最好使用以下内容:
// 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);
}
//在地图上迭代
typedef std::map::迭代器映射;
for(map_iter it=objects.begin();
it!=objects.end();
/*空白*/)
{
iter_映射到_delete=it;
++它;
对象*temp=要删除->秒;
如果(临时)
删除临时文件;
对象。删除(要删除);
}
我建议使用智能指针,例如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::map;
//用这张地图做点什么
map.clear();//对象将自动删除。
您还可以使用std::shared_ptr
(或者boost::shared_ptr
,如果您的编译器不支持C++0x智能指针),这样做的好处是,如果您的映射可以多次包含同一指针,那么它就可以工作,并且如果其他人仍然有指向对象的指针,您的对象就不会被销毁
boost::ptr\u map
也是一个选项,尽管我相信,与手动方法一样,如果map多次包含同一指针,则无法正常工作。我建议使用智能指针,例如std::unique\u 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::map;
//用这张地图做点什么
map.clear();//对象将自动删除。
您还可以使用std::shared_ptr
(或者boost::shared_ptr
,如果您的编译器不支持C++0x智能指针),这样做的好处是,如果您的映射可以多次包含同一指针,那么它就可以工作,并且如果其他人仍然有指向对象的指针,您的对象就不会被销毁
boost::ptr_map
也是一个选项,但我相信,与手动方法一样,如果map多次包含同一指针,则无法正常工作。前提是