首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用boost::shared_ptr时有哪些潜在的危险?

使用boost::shared_ptr时有哪些潜在的危险?
EN

Stack Overflow用户
提问于 2009-03-31 15:05:57
回答 9查看 13.9K关注 0票数 49

当你使用boost::shared_ptr时,有哪些方法可以砸自己的脚?换句话说,当我使用boost::shared_ptr时,我必须避免哪些陷阱

EN

回答 9

Stack Overflow用户

发布于 2009-03-31 15:28:04

为同一对象创建多个不相关的shared_ptr

#include <stdio.h>
#include "boost/shared_ptr.hpp"

class foo
{
public:
    foo() { printf( "foo()\n"); }

    ~foo() { printf( "~foo()\n"); }
};

typedef boost::shared_ptr<foo> pFoo_t;

void doSomething( pFoo_t p)
{
    printf( "doing something...\n");
}

void doSomethingElse( pFoo_t p)
{
    printf( "doing something else...\n");
}

int main() {
    foo* pFoo = new foo;

    doSomething( pFoo_t( pFoo));
    doSomethingElse( pFoo_t( pFoo));

    return 0;
}
票数 25
EN

Stack Overflow用户

发布于 2009-04-04 00:33:32

构造一个匿名临时共享指针,例如在函数调用的参数中:

f(shared_ptr<Foo>(new Foo()), g());

这是因为允许执行new Foo(),然后调用g(),允许g()抛出异常,而无需设置shared_ptr,因此shared_ptr没有机会清理Foo对象。

票数 18
EN

Stack Overflow用户

发布于 2009-04-03 23:47:20

要小心让两个指针指向同一个对象。

boost::shared_ptr<Base> b( new Derived() );
{
  boost::shared_ptr<Derived> d( b.get() );
} // d goes out of scope here, deletes pointer

b->doSomething(); // crashes

相反,请使用以下代码

boost::shared_ptr<Base> b( new Derived() );
{
  boost::shared_ptr<Derived> d = 
    boost::dynamic_pointer_cast<Derived,Base>( b );
} // d goes out of scope here, refcount--

b->doSomething(); // no crash

此外,任何持有shared_ptrs的类都应该定义复制构造函数和赋值操作符。

不要试图在构造函数中使用shared_from_this() --它不会起作用。而是创建一个静态方法来创建类,并让它返回一个shared_ptr。

我已经毫无困难地将引用传递给了shared_ptrs。只需确保在保存之前复制了它(即,没有作为类成员的引用)。

票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/701456

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档