假设我有一个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 01:54:36
你的问题是delete不是一个函数,而是一个关键字,因此你不能接受它的地址。
在C++0x中,将有一个std::default_delete类(由std::unique_ptr使用),您可以使用它,或者正如每个人所说的那样,自己编写一个类将是微不足道的(如果您试图删除不完整的类型,则标准类也会引发编译错误)。
#include <vector>
#include <algorithm>
#include <memory>
int main()
{
std::vector<int*> vec;
std::for_each(vec.begin(), vec.end(), std::default_delete<int>());
}发布于 2010-08-18 01:50:56
是的,但是你需要一个functor:
struct delete_ptr
{
template <typename T>
void operator()(T* pPtr)
{
delete pPtr;
}
};
std::for_each(objs.begin(), objs.end(), delete_ptr());在C++0x中,lambda可以帮助你就地创建函数器:
std::for_each(objs.begin(), objs.end(), [](Obj* pPtr){ delete pPtr; });然而,面对异常,这是危险的。sbi has shown a solution.
发布于 2010-08-18 01:55:42
虽然您可以做到这一点(GMan has shown a solution),但拥有带有指向所拥有资源的裸指针的容器是一种强烈的代码味道。例如,在此代码中:
void foo()
{
std::vector<Obj *> bar;
fill(bar);
use(bar);
std::for_each(objs.begin(), objs.end(), delete_ptr()); // as GMan suggests
}如果use()抛出,你会泄漏对象。
因此,最好使用智能指针:
std::vector< std::shared_ptr<Obj> > bar;https://stackoverflow.com/questions/3505343
复制相似问题