Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Куда уходит память.


Автор: Хоббит 18.1.2009, 12:23
Утечки памяти ищу с помощью valgrind.
Беру пустую программу 

Код

int main(int argc, char *argv[])
{    
    return 0;
}


Проверяю 1 allocs, 0 frees.
Думал, что память выделяется под argv пробовал удалять, valgrind сказал, что это не та память. Наверно память выделяется для вызова программы... не знаю точно.

Далее пишу
mysql_init(&mysql_);
mysql_close(&mysql_);

Проверяю 2 allocs, 0 frees.
Уже интересней
mysql_init(&mysql_);
mysql_real_connect(......);
mysql_close(&mysql_);

17 allocs, 0 frees

И ничего я с этим поделать не мог. Неужели память пропадает в внутренних структурах библиотеки mysql?
Что за 1 блок остается всегда от программы?

Автор: andrew_121 18.1.2009, 12:32
Хоббит, Походу, это тебе нужно капать в код используемой тобой либы. Хотя не факт что память утекает. Возможно, она кешируется.

Автор: vinter 18.1.2009, 12:33
Цитата(Хоббит @  18.1.2009,  13:23 Найти цитируемый пост)
Утечки памяти ищу с помощью valgrind

может проблема в тупости сего инструмента?

Автор: andrew_121 18.1.2009, 12:41
Цитата(vinter @  18.1.2009,  12:33 Найти цитируемый пост)
может проблема в тупости сего инструмента? 

Исключено!!!
В работоспособности сего инструмента убеждался не раз!!!

Автор: Lycifer 18.1.2009, 14:18
Если это нативный код, и тестировал на дебаге, это очень странно.

Автор: Kallikanzarid 18.1.2009, 14:38
Цитата

Исключено!!!
В работоспособности сего инструмента убеждался не раз!!! 


Проверь еще раз:
Код

#include <stdlib.h>
int main() {
    free( malloc(123) );
}




Автор: nickless 18.1.2009, 15:18
Хоббит, название ОСи, версии компилятора, valgrind-а, mysql, (если *nix то еще ядра и glibc), полную строку вызова компилятора, а так же полный вывод valgrind --leak-check=full ./<прога> в студию.

Автор: Хоббит 18.1.2009, 15:19
В принципе, так как нигде больше в программе память не утекает. А соединение с бд создается и уничтожается 1 раз. Отложу этот вопрос до лучших времен.
А какой еще инструмент вы можете предложить?

Автор: Хоббит 18.1.2009, 15:36
Код

michael@newlook:~/develop/test/src$ uname -a
Linux newlook 2.6.18-4-k7 #1 SMP Mon Mar 26 17:57:15 UTC 2007 i686 GNU/Linux
michael@newlook:~/develop/test/src$ g++ -v
Using built-in specs.
Target: i486-linux-gnu
Configured with: ../src/configure -v --enable-languages=c,c++,fortran,objc,obj-c++,treelang --prefix=/usr --enable-shared --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --enable-nls --program-suffix=-4.1 --enable-__cxa_atexit --enable-clocale=gnu --enable-libstdcxx-debug --enable-mpfr --with-tune=i686 --enable-checking=release i486-linux-gnu
Thread model: posix
gcc version 4.1.2 20061115 (prerelease) (Debian 4.1.1-21)
michael@newlook:~/develop/test/src$ valgrind --version
valgrind-3.2.1-Debian
michael@newlook:~/develop/test/src$ ls
Makefile.am  Makefile.in  test.cpp
michael@newlook:~/develop/test/src$ g++ test.cpp
michael@newlook:~/develop/test/src$ ls
a.out  Makefile.am  Makefile.in  test.cpp
michael@newlook:~/develop/test/src$ valgrind --leak-check=full ./a.out
==4519== Memcheck, a memory error detector.
==4519== Copyright (C) 2002-2006, and GNU GPL'd, by Julian Seward et al.
==4519== Using LibVEX rev 1658, a library for dynamic binary translation.
==4519== Copyright (C) 2004-2006, and GNU GPL'd, by OpenWorks LLP.
==4519== Using valgrind-3.2.1-Debian, a dynamic binary instrumentation framework.
==4519== Copyright (C) 2000-2006, and GNU GPL'd, by Julian Seward et al.
==4519== For more details, rerun with: -v
==4519==
==4519==
==4519== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 17 from 1)
==4519== malloc/free: in use at exit: 0 bytes in 0 blocks.
==4519== malloc/free: 0 allocs, 0 frees, 0 bytes allocated.
==4519== For counts of detected errors, rerun with: -v
==4519== All heap blocks were freed -- no leaks are possible.


Все сделал в командной строке. Получилось.

Добавлено @ 15:37
Компилирую в kdevelop, получаю
Код

michael@newlook:~/develop/test/debug/src$ valgrind --leak-check=full ./test
==4532== Memcheck, a memory error detector.
==4532== Copyright (C) 2002-2006, and GNU GPL'd, by Julian Seward et al.
==4532== Using LibVEX rev 1658, a library for dynamic binary translation.
==4532== Copyright (C) 2004-2006, and GNU GPL'd, by OpenWorks LLP.
==4532== Using valgrind-3.2.1-Debian, a dynamic binary instrumentation framework.
==4532== Copyright (C) 2000-2006, and GNU GPL'd, by Julian Seward et al.
==4532== For more details, rerun with: -v
==4532==
==4532==
==4532== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 17 from 1)
==4532== malloc/free: in use at exit: 1,336 bytes in 1 blocks.
==4532== malloc/free: 1 allocs, 0 frees, 1,336 bytes allocated.
==4532== For counts of detected errors, rerun with: -v
==4532== searching for pointers to 1 not-freed blocks.
==4532== checked 105,968 bytes.
==4532==
==4532== LEAK SUMMARY:
==4532==    definitely lost: 0 bytes in 0 blocks.
==4532==      possibly lost: 0 bytes in 0 blocks.
==4532==    still reachable: 1,336 bytes in 1 blocks.
==4532==         suppressed: 0 bytes in 0 blocks.
==4532== Reachable blocks (those to which a pointer was found) are not shown.
==4532== To see them, rerun with: --show-reachable=yes
Profiling timer expired



Добавлено @ 15:39
Параметры компиляции kdevelop все по умолчанию, ничего не менял
Код

Код

#include <iostream>

using namespace std;

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


nickless натолкнул на интересную мысль, выходит все дело в том как kdevelop компилирует файлы

Автор: MAKCim 18.1.2009, 15:43
Цитата(vinter @  18.1.2009,  12:33 Найти цитируемый пост)
может проблема в тупости сего инструмента? 

это ты зря
более полезного инструмента я не видел
а для поиска memory leak'ов он просто незаменимый


Хоббит, 
добавь
--show-reachable=yes

в твоем случае утечек нет
reachable блоки вполне могут аллоцироваться без последующего удаления
если используется принцип "завершение программы - есть освобождение ресурсов"

Добавлено через 5 минут и 2 секунды
Цитата(Kallikanzarid @  18.1.2009,  14:38 Найти цитируемый пост)
Проверь еще раз:

ну я проверил
и что?

Автор: vinter 18.1.2009, 15:51
Цитата(MAKCim @  18.1.2009,  16:43 Найти цитируемый пост)
это ты зря

я просто предположил, до сегодняшнего дня я и не подозревал о нем smile
Просто используя compuware bound checker я с таким не сталкивался

Автор: Dem_max 18.1.2009, 17:31
Попробуй Spy++ из Visual Studio, я сам лично не пользовался но говорят мощная штука. 

Автор: Хоббит 18.1.2009, 17:37
linux

Автор: mes 18.1.2009, 17:44
 smile название темы  прочно вызывает ассоциации с одной песенкой.. 
Куда уходит память
В какие города
И где найти нам средство  
Чтоб вновь вернуть сюда smile 
http://www.karaoke.ru/song/941.htm

Автор: andrew_121 18.1.2009, 18:45
mes, Кому - Что  smile  smile

Добавлено через 46 секунд
Цитата(Kallikanzarid @ 18.1.2009,  14:38)
Цитата

Исключено!!!
В работоспособности сего инструмента убеждался не раз!!! 


Проверь еще раз:
Код

#include <stdlib.h>
int main() {
    free( malloc(123) );
}


И...?

Автор: vinter 18.1.2009, 20:12
Цитата(Dem_max @  18.1.2009,  18:31 Найти цитируемый пост)
Попробуй Spy++ из Visual Studio, я сам лично не пользовался но говорят мощная штука. 

 smile Spy не для этих целей

mes, в точку smile

Автор: xvr 18.1.2009, 20:42
Цитата(Dem_max @ 18.1.2009,  17:31)
Попробуй Spy++ из Visual Studio, я сам лично не пользовался но говорят мощная штука.

Угу, мощная  smile Следит за окнами и передаваемыми сообщениями. К памяти никакого отношения не имеет

Автор: andrew_121 19.1.2009, 12:11
Затупили smile  Понедельник сказывается  smile 

Автор: alexsid1982 19.1.2009, 14:51
Это проблема либы
еще до того как вызывается main происходит разная инициализация, 
парсинг входных параметров и прочая муть...

Для сравнения вот такая прога дает сообщение об утечках  
до проверочной ...

Код

// Control block for leak detection
#include <crtdbg.h>


//
// ------- MAIN ENTRY ---------
//
int  main(int argc, char **argv){

    char* b = new char[111];
    strcpy(b, "TEST MEMORY LEAK");

    _CrtSetReportMode( _CRT_ERROR, _CRTDBG_MODE_FILE );
    _CrtSetReportFile( _CRT_ERROR, _CRTDBG_FILE_STDERR );

    int tmpDbgFlag = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG);
    tmpDbgFlag |= _CRTDBG_DELAY_FREE_MEM_DF;
    tmpDbgFlag |= _CRTDBG_LEAK_CHECK_DF;
    _CrtSetDbgFlag(tmpDbgFlag);

    QApplication a(argc, argv);

    QMainWindow* mainWindow = new QMainWindow();
    mainWindow->show();
    a.exec();
       
    return 0;

    return 0;
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)