假设我有一个std::vector<Obj *> objs (出于性能原因,我有指针,而不是实际的Obj)。
我反复地用obj.push_back(new Obj(...));填充它。
完成后,我必须对推回的元素执行delete。一种方法是这样做:
for (std::vector<Obj *>::iterator it = objs.begin(); it != objs.end(); ++it) {
delete *it;
}但是,如果我可以使用for_each算法来做同样的事情,我很感兴趣:
#include <algorithm>
...
for_each(objs.begin(), objs.end(), delete);你认为如何?
发布于 2010-08-18 02:04:21
不完全是;for_each需要一个可以用()调用的函数或对象,而delete既不是函数也不是对象。您必须将其包装在一个函数(或函数对象)中,可能如下所示:
struct Deleter
{
void operator()(Obj* obj) {delete obj;}
};
std::for_each(objs.begin(), objs.end(), Deleter());但是你应该非常小心地使用原始指针来管理对象的生命周期,特别是当你传递它们的时候。如果您从vector中删除它们,或者重新分配它们,或者清除vector,或者如果异常、中断或函数返回可能导致向量被销毁,则需要记住删除它们。一般来说,将资源管理和资源使用的职责分开总是更好的。
最好使用对象的向量,除非Obj是一个多态基类,或者对象确实足够大或足够复杂,复制它们会对性能产生明显的影响。如果是这种情况(并且您已经对其进行了分析以确保确实是这种情况),则应该考虑智能指针向量(shared_ptr,如果编译器支持,则为unique_ptr ),或者Boost的ptr_vector。
养成使用自动资源管理类的习惯将为您在未来省去很多麻烦。
https://stackoverflow.com/questions/3505343
复制相似问题