Freigeben über


Warnung C6014

Speicherverlust 'Zeigername'.

Diese Warnung gibt an, dass der angegebene Zeiger auf den zugeordneten Speicher oder eine andere zugeordnete Ressource verweist, die nicht freigegeben wurde.

Hinweise

Der Analyzer überprüft auf diese Bedingung, wenn die _Analysis_mode_(_Analysis_local_leak_checks_)-SAL-Anmerkung angegeben wird. Standardmäßig ist diese Anmerkung für den Windows-Kernelmoduscode (Treiber) angegeben. Weitere Informationen zu SAL-Anmerkungen finden Sie unter Verwenden von SAL-Anmerkungen zur Reduzierung von C/C++-Codefehlern.

Diese Warnung wird für Speicher- und Ressourcenlecks gemeldet, wenn die Ressource häufig an einen anderen Speicherort aliast wird. Der Speicher wird als Alias verwendet, wenn ein Zeiger auf den Speicher die Funktion mithilfe einer _Out_ Parameteranmerkung, einer globalen Variablen oder eines Rückgabewerts escapet. Diese Warnung kann beim Beenden der Funktion gemeldet werden, wenn das Argument kommentiert wird, dass seine Freigabe erwartet wird.

Die Codeanalyse erkennt nicht die tatsächliche Implementierung eines Speicherverteilers (mit Adressarithmetik) und erkennt nicht, dass Speicher zugewiesen wird (obwohl viele Wrapper erkannt werden). In diesem Fall erkennt die Analyse nicht, dass der Speicher zugewiesen wurde und diese Warnung ausgibt. Um das falsch positive Ergebnis zu unterdrücken, verwenden Sie eine #pragma warning(disable: 6014) Direktive in der Zeile, die der öffnenden Klammer { des Funktionstexts vorausgeht.

Codeanalysename: MEMORY_LEAK

Beispiele

Der folgende Code generiert Warnung 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();
}

Der folgende Code korrigiert die Warnung durch Freigeben des Arbeitsspeichers:

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

Um diese Arten potenzieller Lecks vollständig zu vermeiden, verwenden Sie die Mechanismen, die von der C++-Standardbibliothek (STL) bereitgestellt werden. Dazu gehören shared_ptr, , unique_ptrund Container wie vector. Weitere Informationen finden Sie unter Intelligente Zeiger und C++-Standardbibliothek.

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

Siehe auch

Warnung C6211