Functions
F.42
Возвращайте `T*` для обозначения позиции (только)
Причина
Именно для этого указатели и предназначены. Возврат T* для передачи владения — это злоупотребление.
Пример
Node* find(Node* t, const string& s) // найти s в двоичном дереве из Node-ов
{
if (!t || t->name == s) return t;
if ((auto p = find(t->left, s))) return p;
if ((auto p = find(t->right, s))) return p;
return nullptr;
}
Если указатель, возвращённый find, не равен nullptr, он указывает на Node, содержащий s. Важно, что это не означает передачу владения указуемым объектом вызывающему.
Примечание
Позиции также можно передавать через итераторы, индексы и ссылки. Ссылка часто является лучшей альтернативой указателю когда нет необходимости использовать nullptr или когда объект, на который ссылаются, не должен изменяться.
Примечание
Не возвращайте указатель на то, что не находится в области видимости вызывающего; см. F.43.
Смотрите также: обсуждение предотвращения висячих указателей
Контроль
Только владельцы должны удалять.
Только владельцы должны нести ответственность за удаление.
- Помечать
delete,std::free()и т.д., применённые к обычномуT*. - Помечать
new,malloc()и т.д., присвоенные обычномуT*.