在我的代码中,我使用boost::threads
,我有一个通过名为fnThread()
的成员函数运行线程的类。在这个fnThread()中,我想创建一个shared_from_this()并将其传递给有信号的听众。但是行boost::shared_ptr<foo> p = shared_from_this()
抛出异常如下;
boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::bad_weak_ptr> > at memory location 0x04c2f720.
违规命令是shared_from_this()。从另一个线程创建shared_from_this()
或者我做错了是不合法的吗?任何帮助表示赞赏。谢谢!
PS:我打算将我的信号参数更改为普通指针,因为它不会影响我的结构。但我赞成shared_ptr&lt;&gt;我希望听到有关该决定的任何评论。也许这对于这种特殊情况来说是一个糟糕的选择。你有什么建议?
编辑:
这是一个简单的课程供您测试
class foo : public boost::enable_shared_from_this<foo>
{
public:
int start()
{
foo_thread.reset(new boost::thread(boost::bind(&foo::fn_foo_thread, this)));
return 0;
}
~foo()
{
if (foo_thread->joinable())
foo_thread->join();
}
private:
boost::scoped_ptr<boost::thread> foo_thread;
void fn_foo_thread()
{
boost::shared_ptr<foo> p = shared_from_this();
std::cout << "foo thread terminated. \n" << std::endl;
}
};
答案 0 :(得分:4)
shared_from_this
可以在另一个线程中使用。如果没有bad_weak_ptr
到shared_ptr
(顾名思义),则抛出this
异常。很可能您的问题存在于代码的其他地方。
答案 1 :(得分:2)
正如@Sam Miller已经提到的,问题存在于其他地方。我可以想象你宣称foo
是scoped_ptr<foo>
。通过这样做,shared_from_this
不可能返回有效的共享指针,因为类型为boost::scoped_ptr
的智能指针不能转移对象的所有权。这是您例外的原因。
答案 2 :(得分:0)
您可以考虑将boost::shared_ptr<>
更改为boost::intrusive_ptr<>
。主要区别在于boost::intrusive_ptr<>
表明引用计数器存储在对象内(尽管可以将其存储在其他位置)。使用嵌入式引用计数器,您可以在构造函数中构造boost::intrusive_ptr<>
,也可以随时从普通指针构造boost::intrusive_ptr<>
(但不要在析构函数中使用{{1}})。
答案 3 :(得分:0)
shared_from_this()
。