Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Параметр smart pointer используется только для доступа к автономному указателю. Вместо этого используйте T* или T&.
Основные рекомендации по C++ : R.30: использование смарт-указателей в качестве параметров только для явной выражения семантики времени существования
Использование интеллектуального типа указателя для передачи данных в функцию указывает, что целевая функция должна управлять временем существования содержащегося объекта. Тем не менее, говорят, что функция использует только интеллектуальный указатель для доступа к автономному объекту и никогда не вызывает любой код, который может привести к его освобождению (т. е. никогда не влияет на его время существования). Тогда обычно не нужно усложнять интерфейс с помощью смарт-указателей. Предпочтителен обычный указатель или ссылка на содержащийся объект.
Замечания
Эта проверка охватывает большинство сценариев, которые также вызывают C26410, C26415, C26417 и C26418. Лучше сначала очистить SMART_PTR_NOT_NEEDED, а затем переключиться на пограничные варианты для общих или уникальных указателей. Для более ориентированной очистки это предупреждение можно отключить.
Помимо стандартных шаблонов std::unqiue_pointer и std::shared_pointer, эта проверка распознает определяемые пользователем типы, которые, скорее всего, предназначены для смарт-указателей. Предполагается, что такие типы определяют следующие операции:
- Перегруженные операторы разыменования или доступа к членам, которые являются общедоступными и не помечены как удаленные.
- Общедоступный деструктор, который не удаляется или не используется по умолчанию, включая деструкторы, которые явно определены пустыми.
Интерпретация операций, которые могут повлиять на время существования содержащихся объектов, широка и включает:
- Любая функция, принимаюющая указатель или параметр ссылки на неконстантный интеллектуальный указатель
- Копирование или перемещение конструкторов или операторов назначения
- Неконстантные функции
Примеры
Громоздкое управление временем существования.
bool set_initial_message(
const std::unique_ptr<message> &m) // C26415, also C26410 NO_REF_TO_CONST_UNIQUE_PTR
{
if (!m || initial_message_)
return false;
initial_message_.reset(m.get());
return true;
}
void pass_message(const message_info &info)
{
auto m = std::make_unique<message>(info);
const auto release = set_initial_message(m);
// ...
if (release)
m.release();
}
Громоздкое управление временем существования — переработано.
void set_initial_message(std::shared_ptr<message> m) noexcept
{
if (m && !initial_message_)
initial_message_ = std::move(m);
}
void pass_message(const message_info &info)
{
auto m = std::make_shared<message>(info);
set_initial_message(m);
// ...
}