C++ std::shared_ptr<..>
может быть пустой и это также может быть нулевым. Обе эти концепции существуют, и они являются не эквивалентом. Кроме того, между этими случаями не всегда подразумевается.Как проверить, является ли опустошить shared_ptr или не имеет никакого отношения
Последний случай является тривиальным для обнаружения, поскольку operator bool
обеспечивает именно этот тест. Согласно документам, он «проверяет, сохраняет ли *this
ненулевой указатель, т. Е. get() != nullptr
».
Есть ли тест для первого случая, случай, когда вещь пусто?
Мое использование для этого довольно простое. У меня есть класс, который имеет статический заводский метод. Внутри статического заводского метода статический локальный shared_ptr
экземпляр класса, инициализированный до nullptr
. Первый вызов этого фабричного метода создает экземпляр класса и инициализирует статический локальный shared_ptr
перед возвратом его копии - это защищено mutex
. То, что shared_ptr
может храниться на любом, скопированном и переданном, дополнительные копии могут быть приобретены путем дополнительных вызовов статической фабрики, и, наконец, когда все копии будут уничтожены, дебектор shared_ptr
уничтожает экземпляр.
Сам экземпляр создается и уничтожается унаследованным C API, завернутым в мой класс, и, хотя эти экземпляры предназначены для совместного использования как одиночные, их также необходимо очистить, когда они больше не нужны - в отличие от одиночки.
На данный момент я использую нуль-чек, чтобы решить, следует ли инициализировать или просто скопировать статический локальный shared_ptr
. Я боюсь, что этот тест не сработает, чтобы обнаружить случай, когда требуется повторная инициализация - например, если что-то пытается получить экземпляр через некоторое время после того, как все предыдущие пользователи отказались от своих ссылок, а общий экземпляр был удален.
Или это правда, что shared_ptr
сбрасывается до nullptr
, когда счетчик ссылок падает до нуля и вызывается делектор? Также для пользовательских удалений?
Актуальный: What is the difference between an empty and a null std::shared_ptr in C++?
Как насчет проверки, если [счетчик] (http://en.cppreference.com/w/cpp/memory/shared_ptr/use_count) равен нулю? –
Из-за примечания: «Однако это не гарантируется в многопоточной среде». – Xharlie
Когда я прочитал это, похоже, что после первой инициализации всегда будет счетчик ссылок 1 для некоторого объекта shared_ptr.Если нет, для какого объекта вы могли бы сделать этот гипотетический вызов для определения его текущего состояния? Похоже, что вам может понадобиться поведение weak_ptr. Или, может быть, вы могли бы просто прояснить вопрос, чтобы сделать этот пункт более ясным (например, случай «если что-то пытается получить экземпляр через некоторое время после того, как все предыдущие пользователи отказались от своих ссылок, а общий экземпляр был удален»). – cnettel