Вопрос о boost::shared_ptr
здесь:
У меня есть 3 класса.
A
- это какой-то главный класс, который отвечает за все.
B
- это класс, который просто имеет функции для выполнения некоторой работы.
Dispatcher
- это просто класс, который оборачивается вокруг отдельного потока, который получает работу из Instaces B
, выполненную в этом потоке.
Так что это выглядит примерно так: 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 */
};
Dispatcher.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
в основном цикле.
Обновление:
Добавлен код и обновлен сам вопрос, чтобы сделать его более понятным.