2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Динамическая память.
Сообщение05.12.2006, 14:53 


20/02/06
113
У меня тут возник один вопросик, можно ли как-нибудь в програме на Си следить за динамической памятью? Я имею ввиду, что допустим в процессе програмы я несколько раз выделяю динамическую память для своих переменных, в програме происходит освобождение этой памяти и выделение. Так вот хотелось бы следить за этим процессом, т.е. каким то образом проверять что все что нужно было удалено и освобождено и что не осталось ни одного указателя на ненужную область памяти. Хотелось бы это делать без помощи внешних библиотек. На крайний случай просто проверять сколько было дин. памяти в начале и сколько в конце, что бы сравнить и хотя бы знать была ли утечка или нет.

 Профиль  
                  
 
 
Сообщение05.12.2006, 22:21 
Заслуженный участник
Аватара пользователя


17/10/05
3709
:evil:
Существует несколько способов:

1) можно подменить в программе malloc(), free() и realloc() на свои функции, делающие тоже самое, но плюс трассу. Желательно подменить new и delete

2) если среда -- MS, то в библиотек есть пара зацепок (hooks), которые позволяют вставить свои функции для обработки. Плюс, есть MS Application Verifier, который рапортует результаты прогона.

 Профиль  
                  
 
 
Сообщение06.12.2006, 00:54 


20/02/06
113
Нет я не работаю, под видовс... Когда Вы говорите, что мне нужно заменить фун-ции malloc и free это не совсем мне решает задачу. Хотя конечно там можно вести счет сколько раз функция вызывалась. Но мне бы хотелось более интересного подхода. Я хочу следить за самой памятью, например проверить сколько памяти в куче до и потом посмотреть сколько после. Желательно делать это без вмешательства ассемблера и т.п. Я хочу проверить если есть неосвобожденная память, ну и если средствами Си это возможно то и узнать где именно этот фрагмент находится. Буду благодарен за любую подсказку.

 Профиль  
                  
 
 
Сообщение06.12.2006, 01:02 
Заслуженный участник
Аватара пользователя


17/10/05
3709
:evil:
Вам нужно посмотреть исходные тексты Вашей библиотеки времени исполнения. Может быть, Вы найдете там ответы на все Ваши вопросы.

Что же касается вышеописанной подмены, то многое зависит от Вас. Я, например, записывал каждое обращение в файл, и потом прогонял скрипт, проверявший парность. Программа, конечно, замедлялась, зато абсолютная уверенность…

Есть и другие трюки. Иногда удобно захватывать память пулами, а потом освобождать пул целиком. Это освобождает от необходимости аккуратно освобождать память в пуле (пул только растет) и уменьшает накладные расходы. Правда, пул можно освободить только когда все объекты в пуле умирают.

 Профиль  
                  
 
 
Сообщение06.12.2006, 02:40 


20/02/06
113
А можно подробнее про пул? Я не совсем с этим понятием знаком. Я не могу проверить исходниик своей библиотеки, я подключаюсь через терминал к юниковскому серверу в универе и у меня очень ограниченный доступ. Мне нужно это сделать стандартными библиотечными функциями.

 Профиль  
                  
 
 
Сообщение06.12.2006, 03:08 
Заслуженный участник
Аватара пользователя


17/10/05
3709
:evil:
Идея стара, но сейчас о ней мало знают / редко пользуются. (А ведь разработка 60х)

Вообще говоря, никто не сказал, что одна куча — это хорошо. Просто — да, но хорошо?!? Слишком часто возникают разные трения. Например, кто-то хапает очень маленькими кусочками, а кто-то большими. Возвращают, но возникает фрагментация памяти. Или другой пример: захват памяти thread'ами. Если памать общая, приходится делать глоабальную блокировку.

Отсюда идея: сделать вариант управления памятью, при котором не просто запрашивают сколько надо, но и из какой кучи (пула). Дальше — интереснее. Пулы можно пополнять динамически (не хватило места — запросим глобальной памяти. Если пул не разделяется между thread'ами, нам и блокировка не нужна (ну, только на момент пополнения). Если разделяется — все равно, блокируются только thread'ы использующие этот пул (блокировка перестает быть глобальной). Мелкие запросы оказываются в одном пуле, крупные — в другом, и фрагментация уменьшается. У пулов может быть общий интрефейс запросов, и разная реализация. Одна из реализаций — когда пул не производит реального возврата памяти (по pool.free(), жадный пул), а возвращает всю память в систему только по уничтожению пула. Жестоко, но иногда очень эффективно.

Описание стандартной Unix-библиотеки есть на Sinlge Unix (посмотрите ссылку в интернет-ресурсах).

 Профиль  
                  
 
 
Сообщение06.12.2006, 16:13 


21/03/06
1545
Москва
Частичный оффтоп:
ИМХО программа должна быть написана так, чтобы свести вероятность утечки памяти в минимуму. Для этого малоподходит язык С, а вот в Си++ уже можно разработать концепции, позволяющие следить за использованием памяти, и очищать ненужную автоматически. См. к примеру Джефф Элджер "C++ for real programmers" и вообще концепцию умных указателей.
Что-то сходу не соображу, какими методами достигнуть похожего в С.

 Профиль  
                  
 
 
Сообщение06.12.2006, 19:52 
Заслуженный участник
Аватара пользователя


17/10/05
3709
:evil:
Бесплатный сыр бывает только в мышеловке. А за «ум» указателей приходиться платить, и, иногда, не мало. Кроме того, мы не всегда пишем программу от начала и до конца. Что делать, если какая-то нужная библиотека не знакома с этой концепцией?

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 8 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group