경고 C26401
(i.11)이 아닌 원시 포인터를
owner<T>
삭제하지 마세요.
설명
이 검사 이동 owner<T>
이 리팩터링의 첫 번째 단계에 적합한 옵션이 될 수 있는 코드를 검색합니다. C26400과 마찬가지로 규칙 I.11 및 R.3을 적용하지만 포인터 수명의 "릴리스" 부분에 중점을 둡니다. 대상이 암시적으로 가정된 소유자가 아닌 경우 연산 delete
자 owner<T>
호출에 대해 경고합니다. 선언에 대한 auto
자세한 내용은 C26400을 참조 하세요. 이 검사 전역 변수, 공식 매개 변수 등을 참조하는 식이 포함됩니다.
경고 C26400 및 C26401은 항상 C26409에서 발생하지만 스마트 포인터로 즉시 마이그레이션할 수 없는 시나리오에 더 적합합니다. 이러한 경우 owner<T>
개념을 먼저 채택할 수 있으며 C26409는 일시적으로 억제될 수 있습니다.
코드 분석 이름: DONT_DELETE_NON_OWNER
참고 항목
예제
struct myStruct {};
myStruct* createMyStruct();
void function()
{
myStruct* pMyStruct = createMyStruct();
// ...
delete pMyStruct; // C26401. Do not delete a raw pointer that is not an owner<T>
}
포인터의 소유권이 gsl::owner로 표시되는 경우 C26401이 제거되었는지 확인합니다.
#include <gsl/pointers>
struct myStruct {};
gsl::owner<myStruct*> createMyStruct();
void function()
{
gsl::owner<myStruct*> pMyStruct = createMyStruct();
// ...
delete pMyStruct; // no warning.
}
이 경고를 delete this
트리거하는 C++ 관용구가 있습니다. 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};
};