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


Предупреждение 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};
};