警告 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_ptr
、unique_ptr
和容器(例如 vector
)。 有关详细信息,请参阅智能指针和 C++ 标准库。
另请参阅
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈