bod*_*ydo 3 c++ memory foreach delete-operator
假设我有一个std::vector<Obj *> objs(出于性能原因,我有指针而不是实际的Objs).
我obj.push_back(new Obj(...));反复填充它.
完成后,我必须delete使用推回元素.一种方法是这样做:
for (std::vector<Obj *>::iterator it = objs.begin(); it != objs.end(); ++it) {
delete *it;
}
Run Code Online (Sandbox Code Playgroud)
但是,如果我可以使用for_each算法来做同样的事情,我感兴趣:
#include <algorithm>
...
for_each(objs.begin(), objs.end(), delete);
Run Code Online (Sandbox Code Playgroud)
你怎么看?
Unc*_*ens 15
你的问题是,这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>());
}
Run Code Online (Sandbox Code Playgroud)
是的,但你需要一个仿函数:
struct delete_ptr
{
template <typename T>
void operator()(T* pPtr)
{
delete pPtr;
}
};
std::for_each(objs.begin(), objs.end(), delete_ptr());
Run Code Online (Sandbox Code Playgroud)
在C++ 0x中,lambda帮助你在原地制作仿函数:
std::for_each(objs.begin(), objs.end(), [](Obj* pPtr){ delete pPtr; });
Run Code Online (Sandbox Code Playgroud)
然而,面对例外,这是危险的.sbi已经展示了一个解决方案.