警告 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_ptr、unique_ptr 和容器(例如 vector)。 有关详细信息,请参阅智能指针和 C++ 标准库。