C6280

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

此警告意味着调用函数存在下面的不一致现象:它使用一个内存分配系列中的某个函数分配内存,但却用另一个内存分配系列中的函数释放内存。只有当 指定_Analysis_mode_(_Analysis_local_leak_checks_) SAL 注释,此分析器检查情况。默认情况下,此批注为 windows 内核模式 (驱动程序) 代码指定。有关SAL注释的详细信息,请参阅使用 SAL 批注以减少 C/C++ 代码缺陷

例如,如果使用 malloc 分配内存,但却用 GlobalFree 或 delete 释放内存,则将生成此警告。在数组 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_ptr, unique_ptr, 和 vector有关更多信息,请参见智能指针(现代 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>)

delete 运算符 (C++)

shared_ptr

unique_ptr

概念

智能指针(现代 C++)