경고 C6280
'variable-name'은 'function-name-1'과 함께 할당되지만 'function-name-2'로 삭제됩니다.
이 경고는 호출 함수가 한 패밀리의 함수를 사용하여 메모리를 일관되지 않게 할당하고 다른 패밀리의 함수를 사용하여 메모리를 해제했음을 나타냅니다.
설명
분석기는 SAL 주석이 지정된 경우에만 _Analysis_mode_(_Analysis_local_leak_checks_)
이 조건에 대해 검사. 기본적으로 이 주석은 Windows 커널 모드(드라이버) 코드에 대해 지정됩니다. SAL 주석에 대한 자세한 내용은 SAL 주석을 사용하여 C/C++ 코드 결함을 줄이는 방법을 참조 하세요.
예를 들어 이 경고는 메모리를 사용하여 할당되지만 사용하거나 delete
사용하여 malloc
GlobalFree
해제된 경우 생성됩니다. 배열 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
을 사용하고 프로세스 힙을 사용합니다. 이 문제는 메모리 손상 및 충돌을 일으킬 수 있습니다.
이러한 불일치는 및free
malloc
/메모리 할당 메커니즘에 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
스마트 포인터
피드백
https://aka.ms/ContentUserFeedback
출시 예정: 2024년 내내 콘텐츠에 대한 피드백 메커니즘으로 GitHub 문제를 단계적으로 폐지하고 이를 새로운 피드백 시스템으로 바꿀 예정입니다. 자세한 내용은 다음을 참조하세요.다음에 대한 사용자 의견 제출 및 보기