Предупреждение C26401
Не удаляйте необработанный указатель, который не является (
owner<T>
i.11)
Замечания
Эта проверка обнаруживает код, в owner<T>
котором перемещение может быть хорошим вариантом для первого этапа рефакторинга. Как и C26400, он применяет правила I.11 и R.3, но фокусируется на "выпуске" части времени существования указателя. Он предупреждает о любом вызове оператора delete
, если его целевой объект не owner<T>
является или неявно предполагаемым владельцем. Дополнительные сведения о объявлениях см. в auto
разделе C26400. Эта проверка включает выражения, ссылающиеся на глобальные переменные, формальные параметры и т. д.
Предупреждения C26400 и C26401 всегда происходят с C26409, но они более подходят для сценариев, когда немедленная миграция на интеллектуальные указатели невозможна. В таких случаях owner<T>
концепция может быть принята первым, и C26409 может быть временно отложена.
Имя анализа кода: DONT_DELETE_NON_OWNER
См. также
Основные рекомендации C++ I.11
Примеры
struct myStruct {};
myStruct* createMyStruct();
void function()
{
myStruct* pMyStruct = createMyStruct();
// ...
delete pMyStruct; // C26401. Do not delete a raw pointer that is not an owner<T>
}
Обратите внимание, что C26401 удаляется, если владение указателем указано gsl::owner.
#include <gsl/pointers>
struct myStruct {};
gsl::owner<myStruct*> createMyStruct();
void function()
{
gsl::owner<myStruct*> pMyStruct = createMyStruct();
// ...
delete pMyStruct; // no warning.
}
Существует идиом C++, который активирует это предупреждение: delete this
Предупреждение намеренно, так как основные рекомендации C++ препятствуют этому шаблону. Предупреждение можно отключить с помощью атрибута gsl::suppress
, как показано в следующем примере:
class MyReferenceCountingObject final
{
public:
void AddRef();
void Release() noexcept
{
ref_count_--;
if (ref_count_ == 0)
{
[[gsl::suppress(i.11)]]
delete this;
}
}
private:
unsigned int ref_count_{1};
};