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

时间:2011-07-04 15:45:04

标签: c++ boost shared-ptr temporaries boost-foreach

我正在做类似于这个项Correct BOOST_FOREACH usage?

的事情

但是,我返回的列表包含在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;
}

然后...... ..

// 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;
}

我希望能够使用上述内容而无需引入变量'myList'。 这可能吗?

2 个答案:

答案 0 :(得分: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()); }
  

功能ok遵循指南   写信,而不好的结构   临时的shared_ptr到位了,   承认记忆的可能性   泄漏。因为函数参数是   以未指定的顺序评估,它是   可能新的int(2)是   首先评估,g()秒,然后我们   可能永远不会到达shared_ptr   构造函数,如果g抛出异常。

     

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

答案 1 :(得分:0)

您需要使用:

T* boost::shared_ptr<T>::get()

示例:

BOOST_FOREACH( int i, static_cast< list<int> >( *(GetList().get()) ) ) {

}

问题是你不能取消引用boost :: shared_ptr并希望它返回它存储的底层对象。如果这是真的,那么将无法取消引用指向boost :: shared_ptr的指针。你需要使用special :: get()方法返回boost :: shared_ptr存储的对象,然后取消引用它。

有关文档,请参阅http://www.boost.org/doc/libs/1_46_1/libs/smart_ptr/shared_ptr.htm#get