Как отслеживать использование памяти в C? - PullRequest
0 голосов
/ 01 октября 2011

Мне нужно сделать проект на C, где я должен постоянно выделять память для больших структур данных, а затем освобождать ее. Существует ли библиотека с функцией, которая помогает отслеживать использование памяти, чтобы я мог быть уверен, что я все делаю правильно? (Я новичок в C)

Например, функция, которая возвращает: А) Общее количество памяти, используемой программой на данный момент, ИЛИ Б) Общее количество памяти осталось, сделал бы работу. Я уже гуглил и искал другие ответы.

Спасибо!

Ответы [ 4 ]

4 голосов
/ 01 октября 2011

Попробуйте tcmalloc : вы ищете профилировщик кучи, хотя valgrind поначалу может быть более полезным.

2 голосов
/ 01 октября 2011

Несмотря на то, что некоторые люди возмущаются этим, в книге «Написание твердого кода» Стива Магуайра есть много разумных идей о том, как отслеживать использование памяти без изменения функций выделения системной памяти. По сути, вместо непосредственного вызова необработанных функций malloc() и т. Д. Вы вызываете свой собственный API распределения памяти, построенный поверх стандартного. Ваш API может отслеживать выделение и освобождение, обнаруживать двойное освобождение, освобождение нераспределенной памяти, невыпущенную (утечку) памяти, полный дамп того, что выделено, и т. Д. Вам нужно либо написать код из книги, либо написать собственный эквивалентный код , Одна интересная проблема заключается в предоставлении трассировки стека для каждого выделения; Не существует стандартного способа определения стека вызовов. (Книга немного устарела; она была написана всего через несколько лет после опубликования стандарта C89 и не использует квалификаторы const.)

Некоторые утверждают, что эти услуги могут предоставляться системой malloc(); действительно, они могут, и в наши дни часто. Вам следует внимательно изучить руководство, предоставленное для вашей версии malloc(), и решить, достаточно ли оно для вас. Если нет, то механизм API-оболочки является разумным. Обратите внимание, что использование вашего собственного API означает, что вы отслеживаете то, что вы явно выделяете, оставляя библиотечные функции не написанными для использования вашего API с использованием системных служб - как, впрочем, и ваш код, под прикрытием.

Вам также следует заглянуть в valgrind. Он отлично отслеживает злоупотребления памятью и, в частности, сообщает об утечке памяти (памяти, которая была выделена, но не освобождена). Он также определяет, когда вы читаете или пишете за пределами выделенного пространства, обнаруживая переполнения буфера.

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

2 голосов
/ 01 октября 2011

Если вас беспокоят утечки памяти, вероятно, вам нужен valgrind. С другой стороны, если вас больше беспокоит то, использует ли ваша структура данных избыточную память, вы можете просто использовать общую функцию mallinfo, включенную в качестве расширения malloc во многих стандартных библиотеках unix, включая glibc on Linux.

0 голосов
/ 01 октября 2011

Каждый раз, когда вы выделяете / освобождаете память, вы можете регистрировать, насколько велика ваша структура данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...