Compartilhar via


Aviso C6014

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();
}

Confira também

Aviso C6211