C6280
C6280 de aviso: <variable> é atribuído com <function>, mas excluído com <function>
Este aviso indica que a função de chamada incompatìvel atribuiu a memória 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 de SAL de _Analysis_mode_(_Analysis_local_leak_checks_) é especificado.Por padrão, a anotação é especificada para o código do kernel do Windows (driver).Para obter mais informações sobre as anotações de SAL, consulte Usando o SAL anotações para reduzir os defeitos no código C/C++.
Por exemplo, esse aviso é gerado se memória é atribuída usando malloc mas liberada usando GlobalFree ou delete.Nas caixas específicas de incompatíveis entre a matriz new[] e deleteescalar, os avisos mais precisos são reportados em vez disso.
Exemplo
O seguinte exemplo de código 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 esse 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 de API diferentes podem usar diferentes heaps.Por exemplo, GlobalAlloc usa o heap do sistema, e usos de free o heap do processo.Isso é provável que os danos de memória e falhar.
Essas inconsistências se aplicam a new/delete e malloc/mecanismos alocação de memória defree .Para evitar completamente esses tipos de inconsistências em potencial, use os mecanismos que são fornecidos pela biblioteca padrão (STL) de modelo C++.Esses incluem shared_ptr, unique_ptr, e vetor.Para obter mais informações, consulte Ponteiros inteligentes (guia de programação do C++ moderno) e Standard C++ Library Reference.
// 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.
}