Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Vazamento de memória 'pointer-name'.
Esse aviso indica que o ponteiro especificado aponta para a memória alocada ou algum outro recurso alocado que não foi liberado.
Comentários
O analisador verifica essa condição somente quando a anotação de SAL _Analysis_mode_(_Analysis_local_leak_checks_) é especificada. Por padrão, essa anotação é especificada para o código do modo kernel (driver) do Windows. Para obter mais informações sobre anotações de SAL, confira Usando Anotações de SAL para reduzir defeitos de código C/C++.
Esse aviso é relatado para vazamentos de memória e de recursos quando normalmente um alias do recurso é criado para outro local. A memória é alias quando um ponteiro para a memória escapa da função usando uma _Out_ anotação de parâmetro, variável global ou valor retornado. Esse aviso pode ser relatado na saída da função se o argumento for anotado de que sua liberação é esperada.
A Análise de Código não reconhecerá a implementação real de um alocador de memória (envolvendo aritmética de endereço) e não reconhecerá que a memória está alocada (embora muitos wrappers sejam reconhecidos). Nesse caso, o analisador não reconhece que a memória foi alocada e emite esse aviso. Para suprimir o falso positivo, use uma diretiva #pragma warning(disable: 6014) na linha que precede a chave de abertura { do corpo da função.
Nome da análise de código: MEMORY_LEAK
Exemplos
O código a seguir gera o aviso C6014:
// 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();
}
O seguinte código corrige o aviso liberando a memória:
// 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();
}
Para evitar completamente esses tipos de possíveis vazamentos, use os mecanismos fornecidos pela STL (Biblioteca Padrão do C++). Isso inclui shared_ptr, unique_ptr, e contêineres como vector. Para obter mais informações, confira Ponteiros inteligentes e Biblioteca Padrão do 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();
}