Я заметил странный факт о 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 (дорого?)?
Спасибо за любое просвещение.
Семантика:
nullptr_t
, оно пустое; то есть, он не владеет указателем.Так что твой пример не пустой; ему принадлежит нулевой указатель.
Кому интересно, что они делятся nullptr
? Как только они оба будут уничтожены, они попытаются delete nullptr;
который не будет иметь никакого эффекта. Это совершенно нормально и вписывается в семантику shared_ptr
,
Это имеет смысл в том смысле, что для значений нулевого указателя не требуется особый случай. То, происходит ли это в вашем коде, сводится к тому, есть ли у вас какая-либо функция, которая может принимать или возвращать ноль shared_ptr
s.
shared_ptr будет подсчитывать и освобождать любой указатель, который ему был дан (не только nullptr, но и что-то недопустимое). так что в вашем примере это приведет к удалению nullptr, что является допустимым случаем.
Все еще безопасно удалить nullptr в C ++ 0x?