Я работаю с кодовой базой, которая была частично реализована кем-то, кто был влюблен в слишком сложные решения для простых задач (например, шаблонные классы с двумя параметрами, которые были созданы только для одной пары типов). Одна вещь, которую она делала, заключалась в том, чтобы создавать объекты в интеллектуальном указателе, а затем хранить объект слабым указателем на себя.
class MyClass {
//...
boost::weak_ptr<MyClass> m_self;
//...
};
boost::shared_ptr<MyClass>
Factory::Factory::Factory::CreateMyClass() {
boost::shared_ptr<MyClass> obj(new MyClass(...));
boost::weak_ptr<MyClass> p(obj);
obj->storeSelfPointer(p);
return obj;
}
Затем класс переходит к использованию m_self, блокируя его и передавая результирующий общий указатель.
В моей жизни я не могу понять, что она пыталась выполнить. Есть ли какой-то образец или идея, которые объясняли бы эту реализацию? Мне кажется, что это совершенно бессмысленно, и я бы хотел его реорганизовать.
EDIT. Я должен отметить, что ни одно из мест, которые используют полученный интеллектуальный указатель, полученный из блокировки m_self, фактически сохраняет умный указатель.