Functions
F.22
Используйте `T*` или `owner<T*>` для обозначения одиночного объекта
Причина
Читаемость: делает смысл обычного указателя понятным. Обеспечивает значительную поддержку инструментов.
Примечание
В традиционном коде на C и C++ обычный T* используется для многих слабо связанных целей, например:
- Идентифицировать (одиночный) объект (не удаляемый этой функцией)
- Указывать на объект, выделенный в свободном хранилище (и удалить его позже)
- Содержать
nullptr - Идентифицировать строку в стиле C (массив символов с нулевым терминатором)
- Идентифицировать массив с отдельно заданной длиной
- Указывать на позицию в массиве
Это затрудняет понимание того, что код делает и что должен делать. Это усложняет проверку и поддержку инструментами.
Пример
void use(int* p, int n, char* s, int* q)
{
p[n - 1] = 666; // Плохо: неизвестно, указывает ли p на n элементов;
// предположим, что нет, или используйте span<int>
cout << s; // Плохо: неизвестно, указывает ли s на массив char с нулём в конце;
// предположим, что нет, или используйте zstring
delete q; // Плохо: неизвестно, выделен ли *q в свободном хранилище;
// предположим, что нет, или используйте owner
}
лучше:
void use2(span<int> p, zstring s, owner<int*> q)
{
p[p.size() - 1] = 666; // OK, ошибка выхода за границы может быть поймана
cout << s; // OK
delete q; // OK
}
Примечание
owner<T*> представляет владение, zstring представляет строку в стиле C.
Также: Предполагайте, что T*, полученный из умного указателя на T (например, unique_ptr<T>), указывает на одиночный элемент.
Смотрите также: Библиотека поддержки
Смотрите также: Не передавайте массив как одиночный указатель
Контроль
- (Простой) ((Границы)) Предупреждать о любой арифметической операции над выражением типа указателя, дающей значение типа указателя.