BOOST_FOREACH对boost :: shared_ptr <list>的迭代

Pes*_*nat 7 c++ boost shared-ptr temporaries boost-foreach

我正在做类似这个项目正确的BOOST_FOREACH用法吗?

但是,我返回的列表包含在boost :: shared_ptr中.如果我没有在BOOST_FOREACH循环之前将列表分配给变量,那么我会在运行时遇到崩溃,因为列表正在被破坏,因为它是临时的.

boost::shared_ptr< list<int> > GetList()
{
    boost::shared_ptr< list<int> > myList( new list<int>() );
    myList->push_back( 3 );
    myList->push_back( 4 );
    return myList;
}
Run Code Online (Sandbox Code Playgroud)

然后......

// Works if I comment out the next line and iterate over myList instead
// boost::shared_ptr< list<int> > myList = GetList();

BOOST_FOREACH( int i, *GetList() ) // Otherwise crashes here
{
    cout << i << endl;
}
Run Code Online (Sandbox Code Playgroud)

我希望能够使用上面的内容而不必引入变量'myList'.这可能吗?

Pes*_*nat 2

好的,shared_ptr 的“最佳实践”提到避免使用未命名的临时对象:

http://www.boost.org/doc/libs/release/libs/smart_ptr/shared_ptr.htm#BestPractices

避免使用未命名的shared_ptr临时变量来节省输入;要了解为什么这很危险,请考虑以下示例:

void f(shared_ptr<int>, int); int g();

void ok() {
    shared_ptr<int> p(new int(2));
    f(p, g()); }

void bad() {
    f(shared_ptr<int>(new int(2)), g()); }
Run Code Online (Sandbox Code Playgroud)

函数 ok 严格遵循准则,而 bad 则就地构造临时的 shared_ptr,承认存在内存泄漏的可能性。由于函数参数以未指定的顺序求值,因此有可能首先对 new int(2) 求值,然后对 g() 求值,并且如果 g 抛出异常,我们可能永远不会到达 shared_ptr 构造函数。

上述异常安全问题也可以通过使用 boost/make_shared.hpp 中定义的 make_shared 或 allocate_shared 工厂函数来消除。这些工厂职能还通过整合分配提供效率效益。