경고 C26409
호출
new
하지 말고delete
명시적으로 대신 사용합니다std::make_unique<T>
(r.11).
코드가 호출 malloc
을 깔끔하게 수행하더라도 연산 delete
new
자를 free
명시적으로 사용하는 것보다 더 나은 옵션을 고려하는 것이 좋습니다.
C++ 핵심 지침:
R.11: 새로 호출하지 말고 명시적으로 삭제
궁극적인 해결 방법은 스마트 포인터 및 적절한 팩터리 함수(예: std::make_unique
.)를 사용하는 것입니다.
설명
- 검사기는 모든 종류의 연산
new
자 또는delete
스칼라, 벡터, 오버로드된 버전(전역 및 클래스별) 및 배치 버전에 대한 호출에 대해 경고합니다. 배치new
사례는 제안된 수정에 대한 핵심 지침의 몇 가지 설명이 필요할 수 있으며 나중에 생략될 수 있습니다.
코드 분석 이름: NO_NEW_DELETE
예제
이 예제에서는 C26409가 명시적 new
및 delete
에 대해 발생했음을 보여줍니다. 대신 스마트 포인터 팩터리 함수를 std::make_unique
사용하는 것이 좋습니다.
void f(int i)
{
int* arr = new int[i]{}; // C26409, warning is issued for all new calls
delete[] arr; // C26409, warning is issued for all delete calls
auto unique = std::make_unique<int[]>(i); // prefer using smart pointers over new and delete
}
이 경고를 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};
};