Я пытаюсь написать функцию, которая получает указатель, использует его, а затем указывает на новый объект. Для этого я использую ptr-to-ptr. Вот как я проверяю ptr-to-ptr, полученный моей функцией:
void modifyPtr(Obj ** ptrToPtr)
{
if (*ptrToPtr == nullptr)
{
return;
}
else
{
// Do everything else!
}
}
Пока писал это, я подумал: а что, если клиент передаст моей функции следующее?
Obj ** ptrToPtr = nullptr;
modifyPtr(ptrToPtr);
В этом случае моя проверка будет опасной, потому что я буду разыменовывать nullptr. Итак, должен ли я добавить дополнительный шаг проверки?
void modifyPtr(Obj ** ptrToPtr)
{
if (ptrToPtr == nullptr)
{
return;
}
else if (*ptrToPtr == nullptr)
{
return;
}
else
{
// Do everything else!
}
}
Я никогда раньше не видел такой проверки, поэтому и сомневаюсь.
Имейте в виду, что я знаю, что в C++ следует избегать использования необработанных указателей. Я работаю со старым кодом и нахожу эту проблему интересной.
ptrToPtr
перед проверкой, является ли оно нулевым. Вам, вероятно, не нужно проверять разыменованный указатель на нуль, поскольку вы все равно собираетесь его изменить (если только вам не нужно что-то делать со старым объектом). Но лучше использовать ссылки вместо двойных указателей, например:void modifyPtr(Obj* &Ptr)
, тогда вызывающая сторона не сможет передать нулевую ссылку - person Remy Lebeau   schedule 10.01.2018Obj ** ptrToPtr = nullptr; modifyPtr(*ptrToPtr);
и получить хорошее неопределенное поведение. - person Mark Ransom   schedule 10.01.2018Obj* &ptr
, совершенно очевидно, что функция ожидает, что вызывающая сторона вместо этого сделает что-то вродеObj *ptr = ...; modifyPtr(ptr);
. - person Remy Lebeau   schedule 10.01.2018return
. Ты либо возвращаешься, либо нет. - person Sid S   schedule 10.01.2018std::shared_ptr
. - person Mark Ransom   schedule 10.01.2018