我正在做类似于这个项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'。 这可能吗?
答案 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。