다음을 통해 공유


경고 C6280

'variable-name'은 'function-name-1'과 함께 할당되지만 'function-name-2'로 삭제됩니다.

이 경고는 호출 함수가 한 패밀리의 함수를 사용하여 메모리를 일관되지 않게 할당하고 다른 패밀리의 함수를 사용하여 메모리를 해제했음을 나타냅니다.

설명

분석기는 SAL 주석이 지정된 경우에만 _Analysis_mode_(_Analysis_local_leak_checks_) 이 조건에 대해 검사. 기본적으로 이 주석은 Windows 커널 모드(드라이버) 코드에 대해 지정됩니다. SAL 주석에 대한 자세한 내용은 SAL 주석을 사용하여 C/C++ 코드 결함을 줄이는 방법을 참조 하세요.

예를 들어 이 경고는 메모리를 사용하여 할당되지만 사용하거나 delete사용하여 mallocGlobalFree 해제된 경우 생성됩니다. 배열 new[] 과 스칼라 delete간의 불일치의 특정 경우 이 경고 대신 보다 정확한 경고가 보고됩니다.

코드 분석 이름: MEMORY_ALLOCATION_MISMATCH

예시

다음 샘플 코드는 이 경고를 생성합니다. pInt 을 사용하여 calloc 할당되지만 일치하지 않는 함수 delete를 사용하여 해제됩니다.

// C6280a_warning.cpp
// cl.exe /analyze /c /EHsc /nologo /W4
#include <sal.h>
#include <stdlib.h>

_Analysis_mode_(_Analysis_local_leak_checks_)

void f(int arraySize)
{
    int *pInt = (int *)calloc(arraySize, sizeof (int));
    // code ...
    delete pInt;
}

다음 코드는 할당 취소 함수 free와 일치하는 값을 사용하여 이 경고를 방지합니다 calloc.

// C6280a_no_warning.cpp
// cl.exe /analyze /c /EHsc /nologo /W4
#include <sal.h>
#include <stdlib.h>

_Analysis_mode_(_Analysis_local_leak_checks_)

void f(int arraySize)
{
    int *pInt = (int *)calloc(arraySize, sizeof (int));
    // code ...
    free(pInt);
}

다른 API 정의는 서로 다른 힙을 사용할 수 있습니다. 예를 들어 GlobalAlloc 시스템 힙 free 을 사용하고 프로세스 힙을 사용합니다. 이 문제는 메모리 손상 및 충돌을 일으킬 수 있습니다.

이러한 불일치는 및freemalloc/메모리 할당 메커니즘에 new/delete 적용됩니다. 이러한 종류의 잠재적 불일치를 완전히 방지하려면 C++ STL(표준 라이브러리)에서 제공하는 메커니즘을 사용합니다. 여기에는 < a0/> unique_ptr및 컨테이너(예: vector.)가 포함shared_ptr됩니다. 자세한 내용은 스마트 포인터 및C++ 표준 라이브러리를 참조하세요.

다음 코드는 다음을 사용하여 unique_ptr이 문제를 완전히 방지합니다.

// C6280b_no_warning.cpp
// cl.exe /analyze /c /EHsc /nologo /W4
#include <sal.h>
#include <vector>
#include <memory>

using namespace std;

_Analysis_mode_(_Analysis_local_leak_checks_)

void f(int arraySize)
{
    // use unique_ptr instead of calloc/malloc/new
    unique_ptr<int[]> pInt(new int[arraySize]);

    // code ...

    // No need for free because unique_ptr
    // cleans up when out of scope.
}

참고 항목

calloc
malloc
free
operator new
delete 연산자
shared_ptr
unique_ptr
스마트 포인터