【发布时间】:2010-01-11 16:20:26
【问题描述】:
我最近开始使用 boost lambda,并认为我会尝试在它将/应该使事情更容易阅读的地方使用它。
我有一些类似于以下的代码
std::vector< X * > v;
for ( int i = 0 ; i < 20 ; ++i )
v.push_back( new X() );
稍后,删除它...
std::for_each( v.begin(), v.end(), boost::lamda::delete_ptr() );
整理得很整齐。
但是,我想我应该尝试使用 lambda 对向量的总体进行“lambda-ising”...然后烟花就开始了...
我试过了..
std::generate_n( v.begin(), 20, _1 = new X() );
但这会引发各种编译器错误。
实现这一目标的最佳“lambda”方式的任何想法。
谢谢 标记。
【问题讨论】:
-
一般情况下,不要将动态分配的指针存储在向量中——你的代码不是异常安全的,如果 X 的构造函数失败会泄漏内存。
-
嗨,乔,我有兴趣对此进行扩展。我不确定 X 的构造函数如何失败并泄漏内存。我认为 C++ 标准说 new 在遇到异常时会返回 null 并在重新抛出异常之前清理内存。当然我可能完全错了。
-
@ScaryAardvark。如果内存不足,New 会抛出 std::bad_alloc - 除非您使用非抛出形式,否则它永远不会返回 null。
-
至于内存泄漏,我有点错误——如果 'new X()' 抛出,你的代码不会泄漏,如果 v.push_back() 抛出它就会泄漏。
标签: c++ stl boost lambda containers