Семантика пустого shared_ptr

Я заметил странный факт о shared_ptr

int* p = nullptr;
std::shared_ptr<int> s(p); // create a count (1).
std::shared_ptr<int> s2(s); // count go to 2.
assert(s.use_count() == 2);

Интересно, какова семантика помимо этого? Почему s и s2 совместно используют nullptr? Есть ли смысл?

Или, может быть, эта необычная ситуация не заслуживает утверждения if (дорого?)?

Спасибо за любое просвещение.

1

Решение

Семантика:

  • Если вы по умолчанию создаете общий указатель или создаете его из nullptr_t, оно пустое; то есть, он не владеет указателем.
  • Если вы создаете его из необработанного указателя, он становится владельцем этого указателя, независимо от того, является ли он пустым. Я думаю, что это сделано по той причине, о которой вы упоминаете (избегая проверки во время выполнения), но я могу только догадываться об этом.

Так что твой пример не пустой; ему принадлежит нулевой указатель.

3

Другие решения

Кому интересно, что они делятся nullptr? Как только они оба будут уничтожены, они попытаются delete nullptr; который не будет иметь никакого эффекта. Это совершенно нормально и вписывается в семантику shared_ptr,

Это имеет смысл в том смысле, что для значений нулевого указателя не требуется особый случай. То, происходит ли это в вашем коде, сводится к тому, есть ли у вас какая-либо функция, которая может принимать или возвращать ноль shared_ptrs.

1

shared_ptr будет подсчитывать и освобождать любой указатель, который ему был дан (не только nullptr, но и что-то недопустимое). так что в вашем примере это приведет к удалению nullptr, что является допустимым случаем.
Все еще безопасно удалить nullptr в C ++ 0x?

0
По вопросам рекламы [email protected]