Во-первых, вы должны скомпилировать свой код с поддержкой отладки (в gcc это -g). Обратите внимание, что в этом нет необходимости, но это позволяет отладчику указывать номера строк в качестве одного из преимуществ.
Затем вы должны запустить свой код с помощью хорошего отладчика, такого как valgrind, gdb или чего-то еще.
Они должны сообщать вам строки, в которых память была выделена, но не освобождена.
Valgrind - очень мощный инструмент для отладки. Вам нужно будет использовать параметр --tool = memcheck (который, я думаю, включен по умолчанию, но это не мешает узнать).