警告 C6014:内存的泄漏。
此警告意味着指定的指针指向分配的内存或一些不会被释放的其他分配资源。只有当 指定_Analysis_mode_(_Analysis_local_leak_checks_) SAL 注释,此分析器检查情况。默认情况下,此批注为 windows 内核模式 (驱动程序) 代码指定。有关SAL注释的详细信息,请参阅使用 SAL 批注以减少 C/C++ 代码缺陷。
示例
下面的代码生成此警告:
// cl.exe /analyze /EHsc /nologo /W4
#include <sal.h>
#include <stdlib.h>
#include <string.h>
_Analysis_mode_(_Analysis_local_leak_checks_)
#define ARRAYSIZE 10
const int TEST_DATA [ARRAYSIZE] = {10,20,30,40,50,60,70,80,90,100};
void f( )
{
int *p = (int *)malloc(sizeof(int)*ARRAYSIZE);
if (p) {
memcpy(p, TEST_DATA, sizeof(int)*ARRAYSIZE);
// code ...
}
}
int main( )
{
f();
}
以下代码通过释放内存更正警告:
// cl.exe /analyze /EHsc /nologo /W4
#include <sal.h>
#include <stdlib.h>
#include <string.h>
_Analysis_mode_(_Analysis_local_leak_checks_)
#define ARRAYSIZE 10
const int TEST_DATA [ARRAYSIZE] = {10,20,30,40,50,60,70,80,90,100};
void f( )
{
int *p = (int *)malloc(sizeof(int)*ARRAYSIZE);
if (p) {
memcpy(p, TEST_DATA, sizeof(int)*ARRAYSIZE);
// code ...
free(p);
}
}
int main( )
{
f();
}
通常当资源 别名 到另一个位置时,该警告针对内存和资源泄漏报告。指针指向的内存,当该内存以_Out_ 参数注释、全局变量或返回值的方式泄露时内存更名。如果参数标释为已将被释放,则此警告在退出函数可报告。
请注意代码分析工具不能识别内存分配器的实际实现 (涉及算术地址) 以及不能识别内存被分配 (虽然大多数包装将被识别)。在这种情况下,代码分析工具不能识别内存分配并发出此警告。若要禁止显示错误,请在函数体左大括号{ 之前的行上 使用 #pragma 指令。
若要完全避免这些潜在的泄露问题,请使用 C++ 标准模板库 (STL) 提供的结构。这些包括shared_ptr, unique_ptr, 和 vector有关更多信息,请参见智能指针(现代 C++)和C++ 标准库参考。
// cl.exe /analyze /EHsc /nologo /W4
#include <sal.h>
#include <memory>
using namespace std;
_Analysis_mode_(_Analysis_local_leak_checks_)
const int ARRAYSIZE = 10;
const int TEST_DATA [ARRAYSIZE] = {10,20,30,40,50,60,70,80,90,100};
void f( )
{
unique_ptr<int[]> p(new int[ARRAYSIZE]);
std::copy(begin(TEST_DATA), end(TEST_DATA), p.get());
// code ...
// No need for free/delete; unique_ptr
// cleans up when out of scope.
}
int main( )
{
f();
}