<?xml version="1.0" encoding="koi8-r"?>
<rss version="0.91">
<channel>
    <title>OpenForum RSS: Как определить утечку памяти в прграмме на С++?</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/1720.html</link>
    <description>Как определить утечку памяти в программе на С++?&lt;br&gt;</description>

<item>
    <title>Как определить утечку памяти в прграмме на С++? (Миша)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/1720.html#14</link>
    <pubDate>Mon, 30 May 2005 15:05:22 GMT</pubDate>
    <description>можно сделать два счетчика, &lt;br&gt;gMemCounter = 0;&lt;br&gt;gMemPlace = 0;&lt;br&gt;&lt;br&gt;и если у тебя gMemCounter будет инкрементироваться на единицу при каждом выделении памяти, то gMemPlace на 2 в степени gMemCounter. в случае утечки получишь точное место&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&amp;gt;&amp;gt;Как определить утечку памяти в программе на С++? &lt;br&gt;&amp;gt;&lt;br&gt;&amp;gt;Я встречал такой метод: &lt;br&gt;&amp;gt;1. Создаётся глобальная и доступная для всей программы переменная int gMemCounter = &lt;br&gt;&amp;gt;0; &lt;br&gt;&amp;gt;2. Для всех функций, которые выделяют или освобождают память (malloc, free, new, &lt;br&gt;&amp;gt;delete, mysql_store_result, mysql_free_result и т.д.) создаются соответсвтующие макросы, которые увеличивают или &lt;br&gt;&amp;gt;уменьшают соответственно наш глобальный счётчик на единицу (если прога многопоточная, то &lt;br&gt;&amp;gt;надо ещё и мьютекс поюзать), например: &lt;br&gt;&amp;gt;#ifdef DEBUG &lt;br&gt;&amp;gt;#define MALLOC(ptr,size) &#092; &lt;br&gt;&amp;gt;ptr = malloc (size); &lt;br&gt;&amp;gt;pthread_mutex_lock(&amp;gMemMutex); &#092; &lt;br&gt;&amp;gt;gMemCounter++; &#092; &lt;br&gt;&amp;gt;pthread_mutex_unlock(&amp;gMemMutex); &lt;br&gt;&amp;gt;#else &lt;br&gt;&amp;gt;#define MALLOC(ptr,size) ptr = malloc (size); &lt;br&gt;&amp;gt;#endif &lt;br&gt;&amp;gt;&lt;br&gt;&amp;gt;3. В самом конце выполнения програм</description>
</item>

<item>
    <title>Как определить утечку памяти в прграмме на С++? (asso)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/1720.html#13</link>
    <pubDate>Wed, 02 Jul 2003 07:37:21 GMT</pubDate>
    <description>&amp;gt;Как определить утечку памяти в программе на С++? &lt;br&gt;&lt;br&gt;Рекомендую valgrind:  http://developer.kde.org/~sewardj/&lt;br&gt;</description>
</item>

<item>
    <title>там где-то что-то было, но, (Арлекин)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/1720.html#12</link>
    <pubDate>Wed, 02 Jul 2003 04:43:01 GMT</pubDate>
    <description>:) Подозрения мучают мусарню. Из тебя, детка, девочка еще может и получится, а я староват уже.&lt;br&gt;</description>
</item>

<item>
    <title>там где-то что-то было, но, (cool_hacker)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/1720.html#11</link>
    <pubDate>Tue, 01 Jul 2003 13:11:53 GMT</pubDate>
    <description>а у нас взяли недавно на работу &quot;интернет-оператора&quot;&lt;br&gt;ходит девочка по чатам и где попало такие вот с-с-сылочки расставляет для рекламы с-с-с-айта&lt;br&gt;А, Арлекин, признайся честно!&lt;br&gt;мучают меня подозрения :-))))&lt;br&gt;</description>
</item>

<item>
    <title>Как определить утечку памяти в прграмме на С++? (David)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/1720.html#10</link>
    <pubDate>Tue, 01 Jul 2003 08:31:30 GMT</pubDate>
    <description>&amp;gt;Оно необходимо. В твоей версии при &lt;br&gt;&amp;gt;&lt;br&gt;&amp;gt;if(...) &lt;br&gt;&amp;gt;    MALLOC(p, s); &lt;br&gt;&amp;gt;else &lt;br&gt;&amp;gt;    ....; &lt;br&gt;&amp;gt;&lt;br&gt;&amp;gt;получится фигня. &lt;br&gt;&lt;br&gt;Согласен, был не прав :) Но для меня это не критично -я считаю хорошим стилем ставить везде скобки явно.&lt;br&gt;Спасибо за наводку, нашёл много полезных вещей. Вот ссылки:&lt;br&gt;http://bsd.opennet.ru/base/faq/prog_faq.txt.html&lt;br&gt;http://mifi3.pp.ru/howto/C++Programming-HOWTO-11.html&lt;br&gt;&lt;br&gt;Во FreeBSD-портах накопал следующее:&lt;br&gt;devel/boehm-gc           http://www.hpl.hp.com/personal/Hans_Boehm/gc/&lt;br&gt;devel/dmalloc            http://dmalloc.com/docs/5.2.0/online/dmalloc.html&lt;br&gt;devel/mprof&lt;br&gt;devel/uds                http://frost.flewid.de/uds/&lt;br&gt;Сам пока не юзал, но судя по описанию - очень даже ничего.&lt;br&gt;</description>
</item>

<item>
    <title>Как определить утечку памяти в прграмме на С++? (pth)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/1720.html#9</link>
    <pubDate>Mon, 30 Jun 2003 14:27:01 GMT</pubDate>
    <description>&amp;gt;Респект абсолютный и полный, но недочёт есть и тут :) - do &lt;br&gt;&amp;gt;while - абсолютно лишне. &lt;br&gt;&lt;br&gt;Оно необходимо. В твоей версии при&lt;br&gt;&lt;br&gt;if(...)&lt;br&gt;    MALLOC(p, s);&lt;br&gt;else&lt;br&gt;    ....;&lt;br&gt;&lt;br&gt;получится фигня.&lt;br&gt;&lt;br&gt;&amp;gt;#else &lt;br&gt;&amp;gt;#define MALLOC(ptr,size) ptr = malloc (size) &lt;br&gt;&lt;br&gt;#define MALLOC(ptr,size) (ptr = malloc(size))&lt;br&gt;&lt;br&gt;&amp;gt;#endif &lt;br&gt;&lt;br&gt;P.S. А по теме - FAQ из ru.unix.prog.&lt;br&gt;&lt;br&gt;</description>
</item>

<item>
    <title>Как определить утечку памяти в прграмме на С++? (David)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/1720.html#8</link>
    <pubDate>Mon, 30 Jun 2003 13:57:05 GMT</pubDate>
    <description>&amp;gt;&lt;br&gt;&amp;gt;Думаю правильным было бы использование следующей конструкции: &lt;br&gt;&amp;gt;#ifdef DEBUG &lt;br&gt;&amp;gt;#define MALLOC(ptr,size) do &#123; &#092; &lt;br&gt;&amp;gt;ptr = malloc (size); &#092; &lt;br&gt;&amp;gt;pthread_mutex_lock(&amp;gMemMutex); &#092; &lt;br&gt;&amp;gt;gMemCounter++; &#092; &lt;br&gt;&amp;gt;pthread_mutex_unlock(&amp;gMemMutex); &#092; &lt;br&gt;&amp;gt;while (0) &lt;br&gt;&amp;gt;#else &lt;br&gt;&amp;gt;#define MALLOC(ptr,size) ptr = malloc (size) &lt;br&gt;&amp;gt;#endif &lt;br&gt;&lt;br&gt;:)&lt;br&gt;Респект абсолютный и полный, но недочёт есть и тут :) - do while - абсолютно лишне. Окончательный вариант:&lt;br&gt;#ifdef DEBUG&lt;br&gt;#define MALLOC(ptr,size) &#123; &#092;&lt;br&gt;ptr = malloc (size); &#092;&lt;br&gt;pthread_mutex_lock(&amp;gMemMutex); &#092;&lt;br&gt;gMemCounter++; &#092;&lt;br&gt;pthread_mutex_unlock(&amp;gMemMutex); &#092;&lt;br&gt;&#125;&lt;br&gt;#else &lt;br&gt;#define MALLOC(ptr,size) ptr = malloc (size)&lt;br&gt;#endif&lt;br&gt;&lt;br&gt;Прошу отметить, что суть вопроса не в правильности составления макроса, а в принципе определения утечки :)&lt;br&gt;</description>
</item>

<item>
    <title>Как определить утечку памяти в прграмме на С++? (.ChiP.)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/1720.html#7</link>
    <pubDate>Mon, 30 Jun 2003 12:32:43 GMT</pubDate>
    <description>&amp;gt;#ifdef DEBUG &lt;br&gt;&amp;gt;#define MALLOC(ptr,size) &#092; &lt;br&gt;&amp;gt;ptr = malloc (size); &lt;br&gt;&amp;gt;pthread_mutex_lock(&amp;gMemMutex); &#092; &lt;br&gt;&amp;gt;gMemCounter++; &#092; &lt;br&gt;&amp;gt;pthread_mutex_unlock(&amp;gMemMutex); &lt;br&gt;&amp;gt;#else &lt;br&gt;&amp;gt;#define MALLOC(ptr,size) ptr = malloc (size); &lt;br&gt;&amp;gt;#endif &lt;br&gt;&lt;br&gt;Этот макрос в 70 лучаев не будет работать корректно. Так, например, для констукции вида &lt;br&gt;if (condtion)&lt;br&gt;    MALLOC(ptr, size);&lt;br&gt;&lt;br&gt;после препроцессирования мы получим (выровненно для наглядности):&lt;br&gt;&lt;br&gt;if (condition)&lt;br&gt;    ptr = malloc (size); &lt;br&gt;pthread_mutex_lock(&amp;gMemMutex);  &lt;br&gt;gMemCounter++; &lt;br&gt;pthread_mutex_unlock(&amp;gMemMutex); ;&lt;br&gt;&lt;br&gt;если условие выполняет - ошибка останется &quot;незамеченной&quot;, если же не выполняется - мы увеличим счетчик без  выделения памяти - итог десятки человеко-часов на поиски ошибки выделения памяти.&lt;br&gt;&lt;br&gt;Думаю правильным было бы использование следующей конструкции:&lt;br&gt;#ifdef DEBUG &lt;br&gt;#define MALLOC(ptr,size) do &#123; &#092;&lt;br&gt;ptr = malloc (size); &#092;&lt;br&gt;pthread_mutex_lock(&amp;gMemMutex); &#092; &lt;br&gt;gMemCounter++; &#092; &lt;br&gt;pthread_mutex_unlock(&amp;gMemMutex); &#092;&lt;br&gt;while (0)&lt;br&gt;#else &lt;br&gt;#define MALLOC(pt</description>
</item>

<item>
    <title>Как определить утечку памяти в прграмме на С++? (sol)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/1720.html#6</link>
    <pubDate>Mon, 30 Jun 2003 12:32:26 GMT</pubDate>
    <description>&amp;gt;#ifdef DEBUG &lt;br&gt;&amp;gt;#define MALLOC(ptr,size) &#092; &lt;br&gt;&amp;gt;ptr = malloc (size); &lt;br&gt;&amp;gt;pthread_mutex_lock(&amp;gMemMutex); &#092; &lt;br&gt;&amp;gt;gMemCounter++; &#092; &lt;br&gt;&amp;gt;pthread_mutex_unlock(&amp;gMemMutex); &lt;br&gt;&amp;gt;#else &lt;br&gt;&amp;gt;#define MALLOC(ptr,size) ptr = malloc (size); &lt;br&gt;&amp;gt;#endif &lt;br&gt;&lt;br&gt;Этот макрос в 70 лучаев не будет работать корректно. Так, например, для констукции вида &lt;br&gt;if (condtion)&lt;br&gt;    MALLOC(ptr, size);&lt;br&gt;&lt;br&gt;после препроцессирования мы получим (выровненно для наглядности):&lt;br&gt;&lt;br&gt;if (condition)&lt;br&gt;    ptr = malloc (size); &lt;br&gt;pthread_mutex_lock(&amp;gMemMutex);  &lt;br&gt;gMemCounter++; &lt;br&gt;pthread_mutex_unlock(&amp;gMemMutex); ;&lt;br&gt;&lt;br&gt;если условие выполняет - ошибка останется &quot;незамеченной&quot;, если же не выполняется - мы увеличим счетчик без  выделения памяти - итог десятки человеко-часов на поиски ошибки выделения памяти.&lt;br&gt;&lt;br&gt;Думаю правильным было бы использование следующей конструкции:&lt;br&gt;#ifdef DEBUG &lt;br&gt;#define MALLOC(ptr,size) do &#123; &#092;&lt;br&gt;ptr = malloc (size); &#092;&lt;br&gt;pthread_mutex_lock(&amp;gMemMutex); &#092; &lt;br&gt;gMemCounter++; &#092; &lt;br&gt;pthread_mutex_unlock(&amp;gMemMutex); &#092;&lt;br&gt;while (0)&lt;br&gt;#else &lt;br&gt;#define MALLOC(pt</description>
</item>

</channel>
</rss>
