Подтвердить что ты не робот

Проверить значение null в std:: shared_ptr

Мне было интересно, нужно ли мне проверять, есть ли sp null, прежде чем использовать его. Исправьте меня, если я ошибаюсь, но создание псевдонима не увеличит счетчик ссылок и, следовательно, введя метод, с которым мы работаем с общим указателем, который мы не знаем, был ли встроенный указатель reset раньше.. am я исправить, предположив это?

Class::MyFunction(std::shared_ptr<foo> &sp)
{    
    ...  
    sp->do_something();  
    ...  
}
4b9b3361

Ответ 1

Большинство общих указателей в точности соответствуют обычным указателям в этом уважение. Вы должны проверить значение null. В зависимости от функции, вы можете переключиться на использование

void myFunction( Foo const& foo );

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

Кроме того, это, вероятно, неверная практика, чтобы сделать функцию общий указатель, если нет специального права собственности семантика. Если функция просто собирается использовать указатель на продолжительность функции, не меняя ее или взяв на себя владение, необработанный указатель, вероятно, более уместен, поскольку он накладывает меньше ограничений на вызывающего абонента. (Но это действительно зависит от того, что делает функция, и почему вы используя общие указатели. И, конечно же, тот факт, что вы передал неконстантную ссылку на общий указатель, вы собираетесь изменить его, поэтому передача общего указателя может быть необходимо.)

Наконец, различные реализации общих указателей делают это более или менее трудно проверить на нуль. С С++ 11 вы можете используйте std::shared_ptr и просто сравните его с nullptr естественно, как и следовало ожидать. Реализация Boost немного нарушенным в этом отношении; вы не можете просто сравнить это с 0 или NULL. Вы должны либо построить пустой boost::shared_ptr для сравнения или вызовите get на нем и сравните полученный необработанный указатель с 0 или NULL.

Ответ 2

Вы должны учитывать, что std::shared_ptr в целом по-прежнему является указателем (инкапсулированным в классе-указателе) и что он действительно может чтобы внутренне быть nullptr. Когда это произойдет, выражения типа:

ptr->
*ptr

приводит к поведению undefined. Итак, да, если вы ожидаете, что указатель также будет nullptr, тогда вы должны проверить его значение с помощью:

ptr != nullptr

или

!ptr

(благодаря оператор bool).

Ответ 3

Нет смысла передавать shared_ptr в качестве ссылки.

Вы можете получить внутренний объект через boost::shared_ptr<T>.get() и проверить nullptr

Также актуально: перейдите в std:)

Изменить. Это реализация: http://www.boost.org/doc/libs/1_55_0/boost/smart_ptr/shared_ptr.hpp И здесь есть нить о ref или no ref: Должен ли я передать shared_ptr по ссылке?

Он использует семантику перемещения при Cx11 и копирует два ints, иначе медленнее, чем передача ссылки, но когда кто-то на этом уровне оптимизации?

Ответ 4

Нет никакого общего ответа на этот вопрос. Вы должны относиться к нему так же, как и любой другой указатель. Если вы не знаете, является ли оно нулевым, проверьте. Если вы считаете, что он никогда не будет null, assert(), чтобы он не был нулевым и использовал его напрямую.

Тот факт, что у вас есть ссылка на shared_ptr или даже на то, что у вас есть shared_ptr, здесь не влияет.