Boost :: weak_ptr для созданного по умолчанию метода Object: lock () возвращает нулевой указатель, когда ожидается аналогичное пустое shared_ptr - PullRequest
0 голосов
/ 27 сентября 2019

У меня есть фрагмент кода, в котором исходный объект создан по умолчанию:

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.

Спасибо

Амин

...