当你使用boost::shared_ptr
时,有哪些方法可以砸自己的脚?换句话说,当我使用boost::shared_ptr
时,我必须避免哪些陷阱
发布于 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;
}
发布于 2009-04-04 00:33:32
构造一个匿名临时共享指针,例如在函数调用的参数中:
f(shared_ptr<Foo>(new Foo()), g());
这是因为允许执行new Foo()
,然后调用g()
,允许g()
抛出异常,而无需设置shared_ptr
,因此shared_ptr
没有机会清理Foo
对象。
发布于 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。只需确保在保存之前复制了它(即,没有作为类成员的引用)。
https://stackoverflow.com/questions/701456
复制相似问题