Uyarı C6014

'pointer-name' belleği sızdırıyor.

Açıklamalar

Bu uyarı, belirtilen işaretçinin ayrılan belleği veya serbest bırakılmış başka bir ayrılmış kaynağı işaret ettiğini gösterir.

Çözümleyici bu koşulu yalnızca SAL ek açıklaması belirtildiğinde _Analysis_mode_(_Analysis_local_leak_checks_) denetler. Varsayılan olarak, bu ek açıklama Windows çekirdek modu (sürücü) kodu için belirtilir. SAL ek açıklamaları hakkında daha fazla bilgi için bkz . C/C++ Kod Hatalarını Azaltmak için SAL Ek Açıklamalarını Kullanma.

Bu uyarı, kaynak genellikle başka bir konuma diğer ad kullanıldığında hem bellek hem de kaynak sızıntıları için bildirilir . Belleğe yönelik bir işaretçi parametre ek açıklaması, genel değişken veya dönüş değeri kullanarak _Out_ işlevden kaçtığında bellek diğer adı kullanılır. Bağımsız değişkenin yayınının beklendiğine ek açıklama eklenirse, işlev çıkışında bu uyarı bildirilebilir.

Kod Analizi bir bellek ayırıcısının gerçek uygulamasını tanımaz (adres aritmetiği içerir) ve belleğin ayrıldığını tanımaz (birçok sarmalayıcı tanınacak olsa da). Bu durumda çözümleyici, belleğin ayrıldığını tanımaz ve bu uyarıyı döndürür. Hatalı pozitifi bastırmak için, işlev gövdesinin açılış ayracından #pragma warning(disable: 6014) önce gelen satırda bir { yönerge kullanın.

Kod analizi adı: MEMORY_LEAK

Örnekler

Aşağıdaki kod C6014 uyarısını oluşturur:

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

Aşağıdaki kod, belleği serbest bırakarak uyarıyı düzeltmektedir:

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

Bu tür olası sızıntıları tamamen önlemek için C++ Standart Kitaplığı (STL) tarafından sağlanan mekanizmaları kullanın. Bunlar , shared_ptrve gibi unique_ptrkapsayıcıları içerirvector. Daha fazla bilgi için bkz . Akıllı işaretçiler ve C++ Standart Kitaplığı.

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

Ayrıca bkz.

Uyarı C6211