The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
Как определить утечку памяти в прграмме на С++?, !*! Vadim, 28-Май-03, 12:03  [смотреть все]
Как определить утечку памяти в программе на С++?
  • Как определить утечку памяти в прграмме на С++?, !*! Olej, 13:16 , 28-Май-03 (1)
    >Как определить утечку памяти в программе на С++?

    Хороший вопрос ;-) - это один из самых проблеммных вопросов C/C++ (разработчики Java мотивирует этим отказ от прямого управления памятью в синтаксисе языка)... Но тут - 2 вопроса:

    1. как определить сам факт утечки памяти?
    2. как определить место утечки памяти?

    1. в долгосрочно работающей программе это видно по наблюдаемому уменьшению free памяти в системе - но это "не факт" при недостаточно большом времени: могут наблюдаться циклические изменения, связанные просто с работой подсистемы управления памятью в зависимости от OS...

    2. никак. Анализировать код программы.
    Это и явилось одной из причин создания Java.


    • Как определить утечку памяти в программе на С++?, !*! DonkeyHot, 13:59 , 28-Май-03 (2)
      >Это и явилось одной из причин создания Java.
      Это явилось причиной широкой распространенности технологии "сборки мусора", наличие которой можно наблюдать почти во всех языках высокого уровня(я не уверен в слове "почти":-).

      • Как определить утечку памяти в программе на С++?, !*! Olej, 14:05 , 28-Май-03 (3)
        >>Это и явилось одной из причин создания Java.
        >Это явилось причиной широкой распространенности технологии "сборки мусора", наличие которой можно наблюдать
        >почти во всех языках высокого уровня(я не уверен в слове "почти":-).
        >

        Со словом "почти" - всё в порядке...
        Всё определяется синтаксическими конструкциями языка:
        - невозможно и представить работу LISP без сборки мусора...
        - но ... "чисто компилирующие" семантики C/C++ или тот-же давний FORTRAN - так же трудно представить со сборщиком мусора - как корова с седлом...

        И потом - всё хорошо в меру: представьте себе приложение в realtime OS (QNX, VxWorks ...) ... со сборщиком мусора: "такое ночью приснится - не проснёшься" (с).

  • Как определить утечку памяти в прграмме на С++?, !*! David, 03:08 , 30-Июн-03 (4)
    >Как определить утечку памяти в программе на С++?

    Я встречал такой метод:
    1. Создаётся глобальная и доступная для всей программы переменная int gMemCounter = 0;
    2. Для всех функций, которые выделяют или освобождают память (malloc, free, new, delete, mysql_store_result, mysql_free_result и т.д.) создаются соответсвтующие макросы, которые увеличивают или уменьшают соответственно наш глобальный счётчик на единицу (если прога многопоточная, то надо ещё и мьютекс поюзать), например:
    #ifdef DEBUG
    #define MALLOC(ptr,size) \
    ptr = malloc (size);
    pthread_mutex_lock(&gMemMutex); \
    gMemCounter++; \
    pthread_mutex_unlock(&gMemMutex);
    #else
    #define MALLOC(ptr,size) ptr = malloc (size);
    #endif

    3. В самом конце выполнения программы проверяется наш счётчик - он, очевидно, должен быть равен нулю, если это не так, то либо есть утечка, либо мы недостаточно аккуратны.

    Этот способ позволяет только определить наличие утечки, но не говорит - где она, у него масса недостатков, но всё же это единственное решение, которое я встречал, и я считаю его вполне применимым.

    • Как определить утечку памяти в прграмме на С++?, !*! sol, 16:32 , 30-Июн-03 (6)
      >#ifdef DEBUG
      >#define MALLOC(ptr,size) \
      >ptr = malloc (size);
      >pthread_mutex_lock(&gMemMutex); \
      >gMemCounter++; \
      >pthread_mutex_unlock(&gMemMutex);
      >#else
      >#define MALLOC(ptr,size) ptr = malloc (size);
      >#endif

      Этот макрос в 70% случаев не будет работать корректно. Так, например, для констукции вида
      if (condtion)
          MALLOC(ptr, size);

      после препроцессирования мы получим (выровненно для наглядности):

      if (condition)
          ptr = malloc (size);
      pthread_mutex_lock(&gMemMutex);  
      gMemCounter++;
      pthread_mutex_unlock(&gMemMutex); ;

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

      Думаю правильным было бы использование следующей конструкции:
      #ifdef DEBUG
      #define MALLOC(ptr,size) do { \
      ptr = malloc (size); \
      pthread_mutex_lock(&gMemMutex); \
      gMemCounter++; \
      pthread_mutex_unlock(&gMemMutex); \
      while (0)
      #else
      #define MALLOC(ptr,size) ptr = malloc (size)
      #endif


    • Как определить утечку памяти в прграмме на С++?, !*! .ChiP., 16:32 , 30-Июн-03 (7)
      >#ifdef DEBUG
      >#define MALLOC(ptr,size) \
      >ptr = malloc (size);
      >pthread_mutex_lock(&gMemMutex); \
      >gMemCounter++; \
      >pthread_mutex_unlock(&gMemMutex);
      >#else
      >#define MALLOC(ptr,size) ptr = malloc (size);
      >#endif

      Этот макрос в 70% случаев не будет работать корректно. Так, например, для констукции вида
      if (condtion)
          MALLOC(ptr, size);

      после препроцессирования мы получим (выровненно для наглядности):

      if (condition)
          ptr = malloc (size);
      pthread_mutex_lock(&gMemMutex);  
      gMemCounter++;
      pthread_mutex_unlock(&gMemMutex); ;

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

      Думаю правильным было бы использование следующей конструкции:
      #ifdef DEBUG
      #define MALLOC(ptr,size) do { \
      ptr = malloc (size); \
      pthread_mutex_lock(&gMemMutex); \
      gMemCounter++; \
      pthread_mutex_unlock(&gMemMutex); \
      while (0)
      #else
      #define MALLOC(ptr,size) ptr = malloc (size)
      #endif


    • Как определить утечку памяти в прграмме на С++?, !*! Миша, 19:05 , 30-Май-05 (14)
      можно сделать два счетчика,
      gMemCounter = 0;
      gMemPlace = 0;

      и если у тебя gMemCounter будет инкрементироваться на единицу при каждом выделении памяти, то gMemPlace на 2 в степени gMemCounter. в случае утечки получишь точное место

      >>Как определить утечку памяти в программе на С++?
      >
      >Я встречал такой метод:
      >1. Создаётся глобальная и доступная для всей программы переменная int gMemCounter =
      >0;
      >2. Для всех функций, которые выделяют или освобождают память (malloc, free, new,
      >delete, mysql_store_result, mysql_free_result и т.д.) создаются соответсвтующие макросы, которые увеличивают или
      >уменьшают соответственно наш глобальный счётчик на единицу (если прога многопоточная, то
      >надо ещё и мьютекс поюзать), например:
      >#ifdef DEBUG
      >#define MALLOC(ptr,size) \
      >ptr = malloc (size);
      >pthread_mutex_lock(&gMemMutex); \
      >gMemCounter++; \
      >pthread_mutex_unlock(&gMemMutex);
      >#else
      >#define MALLOC(ptr,size) ptr = malloc (size);
      >#endif
      >
      >3. В самом конце выполнения программы проверяется наш счётчик - он, очевидно,
      >должен быть равен нулю, если это не так, то либо есть
      >утечка, либо мы недостаточно аккуратны.
      >
      >Этот способ позволяет только определить наличие утечки, но не говорит - где
      >она, у него масса недостатков, но всё же это единственное решение,
      >которое я встречал, и я считаю его вполне применимым.


  • Как определить утечку памяти в прграмме на С++?, !*! Арлекин, 08:51 , 30-Июн-03 (5)
    Ищи на
    http://citforum.ru
    там где-то что-то было, но, насколько я помню (давно смотрел), как-то своеобразно...
  • Как определить утечку памяти в прграмме на С++?, !*! asso, 11:37 , 02-Июл-03 (13)
    >Как определить утечку памяти в программе на С++?

    Рекомендую valgrind:  http://developer.kde.org/~sewardj/




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру