У меня есть фрагмент кода, в котором исходный объект создан по умолчанию:
SimulatedIndexFixingStore::SimulatedIndexFixingStore() : Singleton<SimulatedIndexFixingStore>(),
simulatedFixings_(Dictionary())
{}
Словарь - это typedef для сложного unordered_map карты карты.
Мое решение - использоватьСлабые_поинтеры вместо общих для правильного удаления статических одноэлементных экземпляров в конце моей программы.В следующем бите:
boost::weak_ptr<SimulatedIndexFixingStore>& simulatedIndicesFixings_; <--- default constructed using SimulatedIndexFixingStore()
auto p = simulatedIndicesFixings_.lock(); <--- here the shared ptr p has a NULL pointer!
Насколько я понимаю из определения блокировки чтения () в cppreference, когда создается объект по умолчанию, я бы получил значение shared_ptr p, которое указывает на пустой объект, но не на указатель NULL!
Принимая во внимание, что, глядя внутрь реализации boost_lab_ptr, имеет смысл:
template<class Y>
shared_ptr( weak_ptr<Y> const & r, boost::detail::sp_nothrow_tag )
BOOST_NOEXCEPT : px( 0 ), pn( r.pn, boost::detail::sp_nothrow_tag() )
{
if( !pn.empty() ) // px is left null if the object pn points is empty/default
{
px = r.px;
}
}
Правильно ли мое понимание?Есть ли разница в реализации между двумя библиотеками?Если да, не могли бы вы сообщить мне о любом другом способе повторного использования моего weak_ptr в построенном объекте по умолчанию в более позднем коде, кроме необходимости использовать реализацию std :: weak_ptr.
Спасибо
Амин