Как уже предлагалось, для этого уже существуют отличные инструменты, такие как 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
, в которой вы проверяете записи адресов, которые просят освободить, в вашем связанном списке.Если соответствующей записи нет, это ошибка использования, и вы можете пометить ее так.
В конце вашей программы вы распечатываете или записываете содержимое вашего связанного списка в файл журнала.Если утечек нет, в вашем связанном списке не должно быть записей, но если есть утечки, тогда в лог-файле вы найдете точное место, где была выделена память.
Обратите внимание, что при использовании этого трюка с макросами вы теряете проверку типов, которую предлагают функции, но это изящный маленький трюк, который я часто использую.
Надеюсь, это поможет и всего наилучшего :)