Когда в программе используется malloc и не освобождается память, теряется ли она на компьютере, на котором была запущена программа, после того, как программа была запущена и завершена?
Все ресурсы, полученные процессом, будут освобождены современной ОС после завершения процесса. Обратите внимание, что это не будет изящный выпуск (ваш код не может это обработать).





Это зависит от операционной системы (точнее, от вашей конкретной реализации C, которая неявно содержит вашу ОС). Вам нужно узнать больше об операционных системах, например учебник Операционные системы: три простых штуки (загружается бесплатно).
В современных ОС, таких как Linux, Unix (включая MacOSX, Android и т. д.), Windows и т. д., Каждый процесс имеет свой собственный виртуальное адресное пространство. Когда процесс завершается, все его виртуальное адресное пространство исчезает (включая любые «утечки памяти»).
На практике malloc и free построены над примитивами операционной системы, управляющими виртуальным адресным пространством (в Linux это примитивы системные вызовы, такие как mmap (2) и munmap и, возможно, старый сбрк (2)) и пейджинг. Обратите внимание, что free обычно не освобождает память для ОС (например, с munmap), но чаще отмечает освобожденную зону памяти как повторно используемую будущими malloc-s.
Однако избегание утечки памяти - хорошая дисциплина (и она необходима для долгоживущих процессов, таких как серверы). Тогда такие инструменты, как Valgrind или адресные дезинфицирующие средства, могут помочь в их обнаружении.
Хороший книга на вывоз мусора дает вам концепцию и терминологию, относящуюся к управление памятью. Читайте также про RAII. Подумайте о циркулярные ссылки, умные указатели, слабые ссылки и т. д.
(on old systems like MS-DOS, this might have not been the case, but details matter a lot; on some embedded systems, too)
Не на современной ОС. Боюсь, это довольно широкий вопрос.