Отслеживание утечки памяти - PullRequest
0 голосов
/ 11 августа 2011

Ситуация:

Я вижу, что при закрытии класса увеличивается примерно на 120 КБ, поэтому, когда я закрываю классы, в несколько раз увеличивается объем памяти - и мне нужно выяснить, что вызывает это.

Просто ищу какой-нибудь хороший совет или хитрость, как узнать, что не освобождается / выпущено с vstudio 2010 - какие-нибудь идеи?

Вот более ясно, что я делаю (очень упрощенно)

class cSomeClass
{
 cSomeClass();
 ~cSomeClass();
  int Initialize();
  void Deinitialize();
}


cSomeClass cCamera;

    main()
    {
     Sleep(10000);

    // Do Init / Deinit to find out if we are freeing the memory
    while(1)
    {
      // Init camera
      if(cCamera.Initialize()==0)
      {
       // Rest for a while
       Sleep(1500);
       cCamera.Deinitialize();
       // Rest for a while
       Sleep(1500);
      }

    }
}

Я только что сделал небольшое приложение, чтобы инициализировать / деиницировать объект класса, чтобы увидеть в «диспетчере задач», возвращается ли моя память для этого приложения к его начальному значению - но это не так, он продолжает увеличиваться каждый раз, когда я инициализирую cSomeClass- так что я считаю, что у меня есть что-то, что инициализировано, но не освобождено в Deinitialize.

Обновление:

Я не думаю, что это простой рост памяти, когда приложение запускается, оно стабилизируется послеСкажем, 10 секунд: 1 МБ оперативной памяти, затем, когда while (1) срабатывает при каждой инициализации, которую я вызываю, я получаю + 120kBytes в общей памяти приложения (проверьтев диспетчере задач).

Обновление:

Спасибо Чаду - его поняли с помощью

_CrtDumpMemoryLeaks

Detected memory leaks!
Dumping objects ->
{76} normal block at 0x003F4BC8, 32 bytes long.
 Data: <Logitech QuickCa> 4C 6F 67 69 74 65 63 68 20 51 75 69 63 6B 43 61 
{75} normal block at 0x003F4B80, 8 bytes long.
 Data: < K?     > 20 4B 3F 00 00 00 00 00 
{74} normal block at 0x003F4B20, 32 bytes long.
 Data: < K?  K?         > 80 4B 3F 00 C8 4B 3F 00 CD CD CD CD CD CD CD CD 
{70} normal block at 0x003F4A30, 8 bytes long.
 Data: < )i     > 0C 29 69 00 00 00 00 00 
Object dump complete.

Ответы [ 2 ]

3 голосов
/ 11 августа 2011

Самый простой способ - использовать функции Windows API для отслеживания использования памяти, например _CrtDumpMemoryLeaks .

Использование этого в сочетании с _CrtMemCheckpoint может оказаться жизненно важным при отслеживании упорных утечек.

Если вы используете MFC, вы можете опционально определить DEBUG_NEW, который добавляет дополнительное отслеживание к глобальным операторам new / delete, давая вам номера файлов и строк для каждого утечки выделения, это может быть чрезвычайно полезно также, но он не работает с некоторыми реализациями new (например, std :: nothrow).

0 голосов
/ 11 августа 2011

Я не совсем уверен, что вы имеете в виду под "закрытием класса", но если вы можете запустить свой код в Linux, valgrind всегда является отличным вариантом для отслеживания утечек памяти.Purify также хорошо работает в Windows, но стоит $$.

Другой подход - попытаться решить проблему заранее: используйте умные указатели вместо необработанных указателей.

Наконец убедитесь, что вына самом деле видят утечку, а не просто увеличение памяти до определенного плато.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...