警告 C6308

警告 C6308:”realloc” 可能返回空指针:将空指针赋给“parameter-name”(后者将作为自变量传递给 “realloc”)将导致原始内存块泄漏

注解

如果重新分配不成功,堆重新分配函数不会释放传递的缓冲区,如果处理不当,可能会导致内存泄漏。 若要纠正此问题,请将重新分配函数的结果分配给临时变量,然后在成功重新分配后替换原始指针。

代码分析名称:REALLOCLEAK

示例

以下示例代码将生成警告 C6308。 此问题源于将返回值从 realloc 赋给 x。 如果 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) 提供的机制。 其中包括 shared_ptrunique_ptr 和容器(例如 vector)。 有关详细信息,请参阅智能指针C++ 标准库

另请参阅

警告 C6014