Означает ли это утечку памяти? - PullRequest
0 голосов
/ 05 июня 2019

У меня есть программа на С ++, и я хочу отслеживать память кучи при запуске

int MyFunction(){
  //do function logic here
  //do function logic here

 .....................
  //Check memory state in heap at the end of function
  _CrtMemState crtMemState;
  _CrtMemCheckpoint(&crtMemState);
   printf("Memory: %d\n",crtMemState.lTotalCount);

}

int main(){
  while(true){//Yes infinitive for long run test
   MyFunction();
  }
}

Я получил результат памяти:

Memory: 47435440
Memory: 76571670
Memory: 105710436
Memory: 135412510
Memory: 164726468
Memory: 194256398
Memory: 223569972
......

Это означает, что память увеличиваетсядля выполнения каждой функции.Означает ли это, что MyFunction () имеет утечку?Я попробовал какой-то метод, например визуальный детектор утечки или функцию связи _CRT *, но не получил отчета об утечке.Моя программа работает с увеличением памяти со временем (я проверил PerfMonitor)

1 Ответ

2 голосов
/ 05 июня 2019

Это не значит, что утечка

Если мы посмотрим на этот код:

#include <iostream>
#include <vector>

int MyFunction(){
    // no leak
    static std::vector<int> v;
    v.push_back(1);
    std::cout << "memory used : " << v.size() * sizeof(int) << std::endl;
}

int main(){
  while(true){//Yes infinitive for long run test
   MyFunction();
  }
}

это даст:

memory used : 40140
memory used : 40144
memory used : 40148
File size limit exceeded

Вектор через некоторое время запросит больше памяти, чем может дать ПК, и программа вылетит.

Так что, если ваш MyFunction будет вызываться огромное количество раз, ваша программа тоже аварийно завершит работу.


Но это не всегда утечка. Может быть, может быть нет.

В моем коде нет утечки, и вектор будет уничтожен после основного (ну нет, из-за while(1), но мы знаем, как очистить память).

Утечка - это память, которую мы больше не можем уничтожить, потому что "потеряли" там, где она есть. Как это:

int MyFunction(){
    // leak
    new int();
}

Здесь мы не можем позвонить delete по этому int, потому что его адрес давно потерян.


Вы можете прочитать абзац о Синтаксическая или семантическая утечки памяти здесь .

...