Поделиться через


Предупреждение C26414

"Перемещение, копирование, переназначение или сброс локального интеллектуального указателя".

Основные рекомендации по C++
R.5. Предпочитайте объекты с областью действия, не выделяете кучу ненужным образом.

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

Замечания

Эта проверка распознает как стандартные std::unique_pointer , так и шаблоны, а std::shared_pointer также определяемые пользователем типы, которые, вероятно, предназначены для смарт-указателей. Предполагается, что такие типы определяют следующие операции:

  • перегруженные операторы разыменования или доступа к членам, которые являются общедоступными и не помечены как удаленные;

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

Тип Microsoft::WRL::ComPtr ведет себя как общий указатель, но часто используется в определенных сценариях, которые влияют на управление временем существования COM. Чтобы избежать чрезмерного шума, этот тип отфильтровывается.

Эта проверка ищет явные локальные выделения, назначенные смарт-указателям, чтобы определить, могут ли переменные области работать в качестве альтернативы. Как прямые вызовы оператора new, так и специальные функции, интерпретируются std::make_unique std::make_sharedкак прямые выделения.

Имя анализа кода: RESET_LOCAL_SMART_PTR

Пример

Динамический буфер:

void unpack_and_send(const frame &f)
{
    auto buffer = std::make_unique<char[]>(f.size()); // C26414
    f.unpack(buffer.get());
    // ...
}

Динамический буфер, замененный контейнером:

void unpack_and_send(const frame &f)
{
    auto buffer = std::vector<char>(f.size());
    f.unpack(buffer.data());
    // ...
}