首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >可以通过for_each <algorithm>在C++中调用指针向量的`delete`吗?

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

Stack Overflow用户
提问于 2010-08-18 01:48:00
回答 7查看 7.6K关注 0票数 4

假设我有一个std::vector<Obj *> objs (出于性能原因,我有指针,而不是实际的Obj)。

我反复地用obj.push_back(new Obj(...));填充它。

完成后,我必须对推回的元素执行delete。一种方法是这样做:

代码语言:javascript
运行
复制
for (std::vector<Obj *>::iterator it = objs.begin(); it != objs.end(); ++it) {
    delete *it;
}

但是,如果我可以使用for_each算法来做同样的事情,我很感兴趣:

代码语言:javascript
运行
复制
#include <algorithm>
...
for_each(objs.begin(), objs.end(), delete);

你认为如何?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2010-08-18 01:54:36

你的问题是delete不是一个函数,而是一个关键字,因此你不能接受它的地址。

在C++0x中,将有一个std::default_delete类(由std::unique_ptr使用),您可以使用它,或者正如每个人所说的那样,自己编写一个类将是微不足道的(如果您试图删除不完整的类型,则标准类也会引发编译错误)。

代码语言:javascript
运行
复制
#include <vector>
#include <algorithm>
#include <memory>

int main()
{
    std::vector<int*> vec;
    std::for_each(vec.begin(), vec.end(), std::default_delete<int>());
}
票数 16
EN

Stack Overflow用户

发布于 2010-08-18 01:50:56

是的,但是你需要一个functor:

代码语言:javascript
运行
复制
struct delete_ptr
{
    template <typename T>
    void operator()(T* pPtr)
    {
        delete pPtr;
    }
};

std::for_each(objs.begin(), objs.end(), delete_ptr());

在C++0x中,lambda可以帮助你就地创建函数器:

代码语言:javascript
运行
复制
std::for_each(objs.begin(), objs.end(), [](Obj* pPtr){ delete pPtr; });

然而,面对异常,这是危险的。sbi has shown a solution.

票数 10
EN

Stack Overflow用户

发布于 2010-08-18 01:55:42

虽然您可以做到这一点(GMan has shown a solution),但拥有带有指向所拥有资源的裸指针的容器是一种强烈的代码味道。例如,在此代码中:

代码语言:javascript
运行
复制
  void foo()
  {
    std::vector<Obj *> bar;
    fill(bar);
    use(bar);
    std::for_each(objs.begin(), objs.end(), delete_ptr()); // as GMan suggests
  }

如果use()抛出,你会泄漏对象。

因此,最好使用智能指针:

代码语言:javascript
运行
复制
std::vector< std::shared_ptr<Obj> > bar;
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3505343

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档