Как и было предложено, для этого уже существуют отличные инструменты, такие как Valgrind.
Далее:
Я хотел бы сделать это без каких-либо внешних утилит для практики
Это интересно, и я уверен, что будет выполнять,
Вы можете использовать макрос трюк обнаружить такое использование памяти и ошибки утечки, на самом деле написать свой собственный аккуратный детектор утечки. Вы должны быть в состоянии сделать это, пока у вас есть одна функция распределения и освобождения в вашем проекте.
#define malloc(X) my_malloc(X, __FILE__, __LINE__, __FUNCTION__)
void* my_malloc(size_t size, const char *file, int line, const char *func)
{
void *p = malloc(size);
printf ("Allocated = %s, %i, %s, %p[%li]\n", file, line, func, p, size);
/*Link List functionality goes in here*/
return p;
}
Вы поддерживаете Связанный список адресов, выделяемых вместе с файлом и номером строки из выделенного места. Вы обновляете список ссылок с помощью записей в вашем malloc
.
Как описано выше, вы можете написать реализацию для free
, в которой вы проверяете, что записи в адресах запрашиваются для освобождения от связанного списка. Если нет соответствующей записи, ее ошибка использования, и вы можете ее пометить.
В конце вашей программы вы печатаете или записываете содержимое связанного списка в файл журнала. Если нет утечек, ваш связанный список не должен иметь записей, но если есть какие-то утечки, тогда файл журнала дает точное местоположение места, где была выделена память.
Обратите внимание, что при использовании этого макроса вы теряете тип проверки, который предлагает функция, но это аккуратный небольшой трюк, который я использую много раз.
Надеется, что это помогает, и все самое лучшим :)
Что не так с Valgrind? –
@MitchWheat я упомянул, что я не могу использовать любые внешние утилиты –
Ну, если это для обучения, вы можете узнать, как это делает valgrind ... –