我可以通过for_each <algorithm>在C++中的指针向量上调用`delete`吗?

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)


GMa*_*ckG 9

是的,但你需要一个仿函数:

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已经展示了一个解决方案.