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.
}