Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Не удаляйте необработанный указатель, который не является (
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};
};