BOOST_FOREACH 迭代 boost::shared_ptr;

发布于 2024-11-18 15:53:59 字数 801 浏览 4 评论 0原文

我正在做与此项目类似的事情 正确的 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;
}

然后......

// 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”。 这可能吗?

I'm doing something similar to this item Correct BOOST_FOREACH usage?

However, my returned list is wrapped in a boost::shared_ptr. If I do not assign the list to a variable before the BOOST_FOREACH loop, I get a crash at runtime as the list is getting destructed as it is a temporary.

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

Then later..

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

I would like to be able to use the above without having to introduce a variable 'myList'.
Is this possible?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

终止放荡 2024-11-25 15:53:59

好的,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就位,
承认记忆的可能性
泄露。由于函数参数是
以未指定的顺序评估,它是
new int(2) 可能是
首先评估,然后评估 g(),然后我们
可能永远不会到达shared_ptr
如果 g 抛出异常,则构造函数。

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

Ok, the 'Best Practice' for shared_ptr mentions to avoid using unnamed temporaries:

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

Avoid using unnamed shared_ptr
temporaries to save typing; to see why
this is dangerous, consider this
example:

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()); }

The function ok follows the guideline
to the letter, whereas bad constructs
the temporary shared_ptr in place,
admitting the possibility of a memory
leak. Since function arguments are
evaluated in unspecified order, it is
possible for new int(2) to be
evaluated first, g() second, and we
may never get to the shared_ptr
constructor if g throws an exception.

The exception safety problem described above may also be eliminated by using the make_shared or allocate_shared factory functions defined in boost/make_shared.hpp. These factory functions also provide an efficiency benefit by consolidating allocations.

自我难过 2024-11-25 15:53:59

您需要使用:

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

示例:

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

}

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

请参阅http://www.boost.org/doc/ libs/1_46_1/libs/smart_ptr/shared_ptr.htm#get 查看文档。

You need to use:

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

Example:

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

}

The problem is that you can't dereference a boost::shared_ptr and hope it returns the underlying object it stores. If this was true, then there would be no way to dereference a pointer to a boost::shared_ptr. You need to use the specialized ::get() method to return the object stored by boost::shared_ptr, and then dereference that.

See http://www.boost.org/doc/libs/1_46_1/libs/smart_ptr/shared_ptr.htm#get for the documentation.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文