The OpenNET Project / Index page

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

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"valgrind и все все все"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"valgrind и все все все"  
Сообщение от primus on 22-Сен-07, 22:06 
Как valgrind определяет утечку памяти, и что делает компилятор?
Пишу долго работающую программу (демон). Использую библиотеку commoncpp.
Проверяю valgrind-ом и по сообщениям делаю вывод (может быть скоропалительный и неправильный),
что есть утечка памяти. Количество выделений памяти меньше количества освобождений.
В результате всяческих метаний обнаружил интересный момент.
Вот текст программы (после ВСЕХ обрезаний):

#include <cstdlib>

int main(int argc, char **argv)
{
    return EXIT_SUCCESS;
}

компиляция:

g++ -o main main.cpp

проверка на вшивость:

valgrind ./main
==6508== Memcheck, a memory error detector.
==6508== Copyright (C) 2002-2007, and GNU GPL'd, by Julian Seward et al.
==6508== Using LibVEX rev 1732, a library for dynamic binary translation.
==6508== Copyright (C) 2004-2007, and GNU GPL'd, by OpenWorks LLP.
==6508== Using valgrind-3.2.3, a dynamic binary instrumentation framework.
==6508== Copyright (C) 2000-2007, and GNU GPL'd, by Julian Seward et al.
==6508== For more details, rerun with: -v
==6508==
==6508==
==6508== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 18 from 1)
==6508== malloc/free: in use at exit: 0 bytes in 0 blocks.
==6508== malloc/free: 0 allocs, 0 frees, 0 bytes allocated.
==6508== For counts of detected errors, rerun with: -v
==6508== All heap blocks were freed -- no leaks are possible.

т.е ОК,
но если компилировать вот так (подключаем библиотеку):

g++ -o main main.cpp `ccgnu2-config --libs`

то проверка дает не ожидаемый результат

valgrind ./main
==6542== Memcheck, a memory error detector.
==6542== Copyright (C) 2002-2007, and GNU GPL'd, by Julian Seward et al.
==6542== Using LibVEX rev 1732, a library for dynamic binary translation.
==6542== Copyright (C) 2004-2007, and GNU GPL'd, by OpenWorks LLP.
==6542== Using valgrind-3.2.3, a dynamic binary instrumentation framework.
==6542== Copyright (C) 2000-2007, and GNU GPL'd, by Julian Seward et al.
==6542== For more details, rerun with: -v
==6542==
==6542==
==6542== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 26 from 1)
==6542== malloc/free: in use at exit: 212 bytes in 1 blocks.
==6542== malloc/free: 2 allocs, 1 frees, 732 bytes allocated.
==6542== For counts of detected errors, rerun with: -v
==6542== searching for pointers to 1 not-freed blocks.
==6542== checked 197,332 bytes.
==6542==
==6542== LEAK SUMMARY:
==6542==    definitely lost: 0 bytes in 0 blocks.
==6542==      possibly lost: 0 bytes in 0 blocks.
==6542==    still reachable: 212 bytes in 1 blocks.
==6542==         suppressed: 0 bytes in 0 blocks.
==6542== Rerun with --leak-check=full to see details of leaked memory.

т.е. количество аллокаций не на 1 больше, чем количество освобождений.
Но ведь ни одной функции, класса или чего там еще, я в программе не использовал,
текст остался прежним (см. начало поста).
КАК может такое происходить?

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

 Оглавление

Сообщения по теме [Сортировка по времени, UBB]


1. "valgrind и все все все"  
Сообщение от DeadMustdie email(??) on 23-Сен-07, 15:11 
По-порядку:

1. valgrind определяет утечку памяти за счет ведения учета операций выделения и освобождения памяти через malloc/free, new/delete и new[]/delete[]. При завершении процесса производится проверка соответствия выделенного освобожденному. Ненулевая величина в поле "still reachable" говорит о наличии динамически выделенных участков памяти, на которые есть указатели в стеке и в глобальных переменных - либо в других участках динамической памяти, которые, сами по себе, доступны через стек или глобальные переменные.

2. Появление ненулевого "still reachable" при пустом main() после подключения некоей библиотеки означает, что код инициализации библиотеки (например, код конструкторов глобальных объектов) содержит операции выделения памяти, а код очистки (тех же деструкторов) эту память не освобождает. В принципе нет ничего плохого в том, что для работы библиотеки постоянно требуется некая фиксированная область памяти, управляемая ей. Главное, чтобы такая память не росла по мере работы программы.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ] [Рекомендовать для помещения в FAQ]




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

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