2013-04-07 4 views
1

Я заметил странный факт о 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 (дорого?)?

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

+0

AFAICT, не имеет значения, является ли оно нулевым или является ли он действительным объектом, поэтому зачем ему это нужно? – chris

+0

Я не предполагаю, что указатели подсчета ссылок имеют специальную обработку для nullptr. – BlackCat

+1

В C++ 11 'use_count()' должен быть '0' на пустом' shared_ptr' (20.7.2.2.5/7). – ipc

ответ

3

Семантика:

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

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

+0

Спасибо, я думаю, это не имеет значения. Кстати, распределение счетных счетчиков довольно дорого, чем проверка времени выполнения (но эта ситуация, конечно, реже). –

1

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

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

+0

Благодарим за быстрый ответ ! –

0

shared_ptr будет считать и освобождать любой указатель, который он дал (не только nullptr, но и что-то недействительное). поэтому в вашем примере это приведет к удалению nullptr, который является допустимым случаем. Is it still safe to delete nullptr in c++0x?

Смежные вопросы