Поделиться через


C6014

предупреждение C6014: Утечка памяти.

Это предупреждение означает, что данный указатель указывает на выделенную память или другие выбранные ресурсы, которые не были освобождены.Анализатор проверяет наличие этого условия, только если указана аннотация SAL _Analysis_mode_(_Analysis_local_leak_checks_).По умолчанию эта аннотация указана для кода в режиме ядра Windows (драйвера).Дополнительные сведения об аннотациях SAL см. в разделе Использование аннотаций SAL для сокращения количества дефектов в коде C/C++.

Пример

Данное предупреждение создается в следующем коде:

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

В следующем коде предупреждение исправлено путем освобождения памяти:

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

Это предупреждение возникает и для памяти, и для утечки ресурсов, когда ресурс часто использует псевдоним в другом месте.Для памяти создается псевдоним, когда указатель на область памяти избегает функцию с помощью заметки параметра _Out_, глобальной переменной или возвращаемого значения.Это предупреждение может возникнуть при выходе из функции, если аргумент функции объявляется как ожидаемый для освобождения.

Обратите внимание, что анализ кода не распознает фактическую реализацию распределителя памяти (включая арифметические операции адреса) и не распознает, что память выделена (хотя многие программы-оболочки будут распознаны).В этом случае анализатор не распознает, что память была выделена, и выдаст это предупреждение.Чтобы отключить срабатывание ложного положительного результата используйте директиву #pragma в строке, которая предшествует открывающейся скобке { тела функции.

Чтобы избежать все эти типы возможных утечек, используйте механизмы, предоставляемые библиотекой стандартных шаблонов (STL) C++.Они включают shared_ptr, unique_ptr и vector.Дополнительные сведения см. в разделах Интеллектуальные указатели (современный C++) и Справочник по стандартной библиотеке C++.

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

См. также

Ссылки

C6211