다음을 통해 공유


경고 C26407

범위가 지정된 개체를 선호하고 불필요하게 힙 할당하지 않음(r.5)

포인터의 불필요한 사용을 방지하기 위해 로컬 할당의 일반적인 패턴을 검색하려고 합니다. 예를 들어 연산 new 자 호출의 결과가 지역 변수에 저장되고 나중에 명시적으로 삭제되는 경우를 감지합니다. 이 검사 C++ 핵심 지침 규칙 R.5를 지원합니다. 범위가 지정된 개체를 선호하고 불필요하게 힙 할당하지 마세요. 이 문제를 해결하려면 원시 포인터 대신 RAII 형식을 사용하고 리소스를 처리하도록 허용합니다. 물론 단일 개체를 할당하기 위해 래퍼 형식을 만들 필요는 없습니다. 대신 개체 형식의 지역 변수가 더 잘 작동합니다.

설명

  • 경고 수를 줄이기 위해 코드 분석은 소유자 포인터에 대해서만 이 패턴을 검색합니다. 따라서 먼저 소유자를 제대로 표시해야 합니다. 이러한 시나리오를 지원하는 고객으로부터 Visual Studio C++ 개발자 커뮤니티 에 대한 피드백을 받는 경우 원시 포인터를 포함하도록 이 분석을 쉽게 확장할 수 있습니다.

  • 범위가 지정된 개체 용어는 약간 오해의 소지가 있을 수 있습니다. 일반적으로 수명이 자동으로 관리되는 지역 변수 또는 동적 리소스를 효율적으로 관리하는 스마트 개체를 사용하는 것이 좋습니다. 스마트 개체는 힙 할당을 수행할 수 있지만 코드에서는 명시적이지 않습니다.

  • 동적 버퍼에 종종 필요한 배열 할당에서 경고가 발생하는 경우 표준 컨테이너를 사용하여 수정할 std::unique_pointer<T[]>수 있습니다.

  • 이 패턴은 지역 변수에 대해서만 검색됩니다. 할당이 전역 변수에 할당된 다음 동일한 함수에서 삭제되는 경우에는 경고하지 않습니다.

코드 분석 이름: DONT_HEAP_ALLOCATE_UNNECESSARILY

예제 1: 힙에 불필요한 개체 할당

auto tracer = new Tracer();
ScanObjects(tracer);
delete tracer;  // C26407

예제 2: 힙에서 불필요한 개체 할당(로컬 개체로 고정)

Tracer tracer;  // OK
ScanObjects(&tracer);

예제 3: 힙에 불필요한 버퍼 할당

auto value = new char[maxValueSize];
if (ReadSetting(name, value, maxValueSize))
    CheckValue(value);
delete[] value; // C26407

예제 4: 힙에 불필요한 버퍼 할당(컨테이너로 고정)

auto value = std::vector<char>(maxValueSize); // OK
if (ReadSetting(name, value.data(), maxValueSize))
    CheckValue(value.data());