Partilhar via


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

Consulte também

Referência

calloc

malloc

livre

operator new (<new>)

Excluir operador (C++)

shared_ptr

unique_ptr

Conceitos

Ponteiros inteligentes (guia de programação do C++ moderno)