首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
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

Stack Overflow用户

发布于 2010-08-18 02:04:21

不完全是;for_each需要一个可以用()调用的函数或对象,而delete既不是函数也不是对象。您必须将其包装在一个函数(或函数对象)中,可能如下所示:

代码语言:javascript
运行
复制
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

养成使用自动资源管理类的习惯将为您在未来省去很多麻烦。

票数 2
EN
查看全部 7 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3505343

复制
相关文章

相似问题

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