Compartilhar via


C6280

Aviso C6280: <variável> é atribuída com <função>, mas excluída com <função>

Este aviso indica que a função de chamada alocou memória inconsistentemente usando uma função de uma família de alocação de memória e a liberou usando uma função de outra família de alocação de memória.O analisador verifica essa condição somente quando a anotação SAL _Analysis_mode_(_Analysis_local_leak_checks_) é especificada.Por padrão, a anotação é especificada para o código de modo de kernel do Windows (driver).Para obter mais informações sobre anotações SAL, consulte Usando anotações de SAL para reduzir defeitos de código do C/C++.

Por exemplo, esse aviso seria gerado se a memória fosse atribuída usando malloc mas liberada usando GlobalFree ou delete.Em casos específicos de incompatibilidades entre a matriz new[] e delete escalar, os avisos mais precisos são reportados em vez disso.

Exemplo

O código de exemplo a seguir gera este aviso.

// 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;
}

Para corrigir este aviso, use este código:

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

As definições diferentes de API podem usar heaps diferentes.Por exemplo, GlobalAlloc usa a heap do sistema, e free usa a heap do processo.Isso provavelmente causará corrupções e panes na memória.

Essas inconsistências se aplicam aos mecanismos de alocação de memória new/delete e malloc/free.Para evitar esses tipos de inconsistências potenciais no geral, use os mecanismos que são fornecidos pela STL (Biblioteca de Modelos Padrão) do C++.Incluem shared_ptr, unique_ptr e vector.Para obter mais informações, consulte Ponteiros inteligentes (C++ moderno) e Referência da Biblioteca Padrão 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.
}

Consulte também

Referência

calloc

malloc

free

operador new (<new>)

Operador delete (C++)

shared_ptr

unique_ptr

Conceitos

Ponteiros inteligentes (C++ moderno)