C6280

警告 C6280:<variable> 使用 <function> 分配,但使用 <function> 删除

此警告意味着调用函数不一致分配内存使用函数从一个内存分配系列和释放了它使用函数从另一个内存分配系列。 只有 + 当 _Analysis_mode_(_Analysis_local_leak_checks_) SAL 注释指定了,则分析器检查此条件。 默认情况下,此批注为 windows 内核模式 (驱动程序) 代码指定。 有关 SAL 注释的更多信息,请参见 使用 SAL 批注以减少 C/C++ 代码缺陷

例如,通过使用 GlobalFree 或 delete,因此,如果分配内存时使用 malloc,但会释放将生成此警告。 在给定用例数组 new[] 和标量 delete之间不匹配,更准确的警告报告而不是使用一个。

示例

下面的代码示例生成此警告。

// cl.exe /analyze /c /EHsc /nologo /W4
#include <sal.h>
#include <stdlib.h>
 
_Analysis_mode_(_Analysis_local_leak_checks_)
 
void f(int arraySize)
{
    int *pInt = (int *)calloc(arraySize, sizeof (int));
    // code ...
    delete pInt;
}

若要更正此警告,请使用此代码:

// cl.exe /analyze /c /EHsc /nologo /W4
#include <sal.h>
#include <stdlib.h>
 
_Analysis_mode_(_Analysis_local_leak_checks_)
 
void f(int arraySize)
{
    int *pInt = (int *)calloc(arraySize, sizeof (int));
    // code ...
    free(pInt);
}

不同的 API 定义可以使用不同的堆。 例如,GlobalAlloc 使用系统堆和 free 用于处理堆。 这可能导致内存损坏和系统崩溃。

这些不一致适用于 new/delete 和 malloc/free 内存分配结构。 若要完全避免这些潜在的不一致,请使用 C++ 标准模板库 (STL) 提供的结构。 其中包括 shared_ptrunique_ptr向量。 有关更多信息,请参见智能指针(现代C++)标准C++库参考

// cl.exe /analyze /c /EHsc /nologo /W4
#include <sal.h>
#include <vector>
#include <memory>
 
using namespace std;
 
_Analysis_mode_(_Analysis_local_leak_checks_)

void f(int arraySize)
{
    // use unique_ptr instead of calloc/malloc/new
    unique_ptr<int[]> pInt(new int[arraySize]);
    
    // code ...
 
    // No need for free because unique_ptr 
    // cleans up when out of scope.
}

请参见

参考

calloc

malloc

free

operator new (<new>)

删除运算符(C++)

shared_ptr

unique_ptr

概念

智能指针(现代C++)