Appropriate use for boost::shared_ptr?
Appropriate use for boost::shared_ptr?
关于boost::shared_ptr
的问题:
我有三节课。
A
是一种Main类,它负责管理一切。
B
是一个类,它只具有做一些工作的函数。
Dispatcher
只是一个包裹在一个单独线程周围的类,它在这个线程中完成了B
的Instaces的工作。
所以它是这样工作的:A
有一个Dispatcher
的实例。现在,A
偶尔会生成B
的一个实例,并将其传递给调度器。
重要的是,B
需要在完成后调用A::callback()
。这就是B
在其构造函数中引用a的原因(参见下面的代码)
A.hpp
class A : public boost::enable_shared_from_this<A>
{
public:
A();
void sendB();
void callback();
private:
Dispatcher m_Dispatcher;
};
B.hpp
class B
{
public:
B(boost::shared_ptr<A> ptr);
boost::shared_ptr<A> m_PointerToA;
/* Some other functions */
};
调度员.hpp
class Dispatcher
{
public:
void run();
void dispatch(boost::shared_ptr<B> b);
private:
void doWork();
boost::thread m_Thread;
};
A.cpp
A::A()
{
m_Dispatcher.run();
}
void A::sendB()
{
boost::shared_ptr ptr_B;
ptr_B.reset(new B(this->shared_from_this);
m_Dispatcher.dispatch(ptr_B);
}
B.cpp
B::B(boost::shared_ptr<A> ptr) :
: m_PointerToA(ptr)
{
}
main_example.cpp
int main()
{
A instanceA;
while(true)
{
instanceA.sendB();
/* Do some other stuff */
}
return 0;
}
所以我的问题是:
为此目的使用boost::shared_ptr合理吗
我不确定shared_ptr
在这里是否合适。我的问题是,当我从B
调用构造函数并将this
指针传递给它时,我不知道会发生什么。现在,根据shared_ptr
,我假设m_PointerToA
拥有A
的所有权。但这意味着,当Dispatcher
中的工作完成,并且我的B
实例被删除时,它也会删除对m_PointerToA
的引用,这实际上意味着它会杀死对象本身,尽管主循环中有A
的实际实例。
更新:
添加了一些代码并更新了问题本身,使其更加清晰。
这个设计没有什么特别的问题。然而,我更喜欢使用CCD_ 23&boost::bind
。它为回调提供了更好的灵活性,并且不会将B与A紧密联系在一起。当然,您仍然需要注意不同的常见线程注意事项。
是的,只复制/分配一个shared_ptr
是可以的,它只会增加引用计数。
在您的示例中,shared_from_this()
将从this
持有的weak_ptr
创建一个(此处:临时)shared_ptr
(引用计数1),因此当您分配/复制构造m_PointerToA
时,在ctor返回之前,引用计数将临时增加到2,临时对象将被销毁,再次将引用计数减少到1(shared_ptr"知道"B
对象中的一个实例)。
所以,是的,如果B被删除,它将在这种情况下销毁A(因为引用计数降至0)。
您关心的
这意味着,如果我的B实例被删除,它也会删除m_PointerToA,这也会杀死我的A实例。当然,我最初的
A
实例在其他地方。
仅显示,如果您计划/需要/打算保留指向A
实例的指针以供进一步使用,则也应该使用shared_ptr
而不是原始指针。如果您可以控制A
的接口,那么最简单的方法就是使用这样的命名构造函数:
class A : public boost::enable_shared_from_this<A> {
public:
static boost::shared_ptr<A> create();
void initClassB();
// ....
private:
A();
A( const A & other );
A& operator=( const A & rhs );
};
boost::shared_ptr<A> A::create() {
return boost::shared_ptr<A>( new A() );
}
然后,即使B
的实例被删除,A
的实例仍将存在,因为shared_ptr
的引用计数仍然(至少)为1。
- CLANG 编译器 说:变量"PTR"可能未初始化
- 在以唯一ptr为值的C++映射中,动态内存何时会被销毁
- 将 ptr 传递给 ptr 到 A 作为参数传递给 A 的函数是不好的做法吗?
- 为共享 ptr 向量实现复制 c'tor?
- 字符和整数中 **(ptr+1) 的值差异
- C++:在不中断共享的情况下通过引用传递共享 PTR?
- 如何将派生类从基 ptr 分配给 nlohmann::json
- 引用 std::shared:ptr 以避免引用计数
- 为什么我不能在不进行任何转换的情况下将浮点数放入任何类型的 ptr 中?
- 在调用函数时,ptr** 和 ptr*& 之间是否有区别,或者首选C++?
- 另一种类型的智能ptr,比如具有弱refs的unique_ptr
- 尝试打印出 *ptr++ 的值,以了解它是如何工作的
- 如何控制共享 ptr 引用计数?
- dopen():不以 root 身份运行时"failed to map segment from shared object"
- C++中的指针否定 (!ptr == NULL)
- 从const ptr*转换为ptr*时出现问题
- 无法使用 libtool 将 -shared 参数传递给 g++
- boost::shared_ptr和std::shared-ptr的同居
- 我可以用std::shared_ptr而不是boost::shared-ptr构建boost库吗
- shared-ptr-C++shared_ptr与unique_ptr用于资源管理