다음을 통해 공유


경고 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++ 표준 라이브러리를 참조하세요.

참고 항목

경고 C6014