경고 C6308
'realloc'은 null 포인터를 반환할 수 있습니다. 'realloc'에 인수로 전달되는 'parameter-name'에 null 포인터를 할당하면 원래 메모리 블록이 유출됩니다.
설명
재할당에 실패한 경우 힙 재할당 함수는 전달된 버퍼를 해제하지 않으며, 제대로 처리되지 않으면 메모리 누수로 이어질 수 있습니다. 이 문제를 해결하려면 재할당 함수의 결과를 임시 변수에 할당한 다음, 다시 할당에 성공한 후 원래 포인터를 대체합니다.
코드 분석 이름: REALLOCLEAK
예시
다음 샘플 코드는 경고 C6308을 생성합니다. 이 문제는 반환 값의 할당에서 realloc
비롯됩니다 x
. 실패하고 null 포인터를 반환하는 경우 realloc
가리키는 원래 메모리 x
는 해제되지 않습니다.
#include <malloc.h>
#include <windows.h>
void f( )
{
char *x = (char *) malloc(10);
if (x != NULL)
{
x = (char *) realloc(x, 512);
// code...
free(x);
}
}
이 문제를 해결하려면 임시 변수를 만들어 반환 값을 realloc
저장할 수 있습니다. 이렇게 변경하면 오류가 발생하면 이전에 할당된 메모리를 안전하게 realloc
해제할 수 있습니다.
#include <malloc.h>
#include <windows.h>
void f()
{
char *x = (char *) malloc(10);
if (x != NULL)
{
char *tmp = (char *) realloc(x,512);
if (tmp != NULL)
{
x = tmp;
}
// code...
free(x);
}
}
이 경고는 재할당 함수의 결과를 할당할 때 다시 할당할 버퍼에 대한 라이브 별칭이 있는 경우 노이즈를 생성할 수 있습니다.
이러한 종류의 문제를 모두 방지하려면 C++ STL(표준 라이브러리)에서 제공하는 메커니즘을 사용합니다. 여기에는 < a0/> unique_ptr
및 컨테이너(예: vector
.)가 포함shared_ptr
됩니다. 자세한 내용은 스마트 포인터 및C++ 표준 라이브러리를 참조하세요.
참고 항목
피드백
https://aka.ms/ContentUserFeedback
출시 예정: 2024년 내내 콘텐츠에 대한 피드백 메커니즘으로 GitHub 문제를 단계적으로 폐지하고 이를 새로운 피드백 시스템으로 바꿀 예정입니다. 자세한 내용은 다음을 참조하세요.다음에 대한 사용자 의견 제출 및 보기