1) Обработка динамической памяти не выполняется компилятором. Есть библиотеки времени выполнения, которые заботятся об этом. Например, : glibc предоставляет такие API, как malloc и free, которые внутренне выполняют системные вызовы (sys_brk) для обработки области кучи.
2) Освобождение одной и той же памяти дважды означает следующее условие:
Предположим, у вас есть char * cptr;
Вы выделяете память, используя:
cptr = (char *) malloc (SIZE);
Теперь, когда вам больше не нужна эта память, вы можете освободить ее, используя это:
бесплатно (СРТК);
Теперь здесь происходит то, что память, на которую указывает cptr, свободна для использования.
Предположим, что в более поздний момент времени в программе вы снова вызовете free (cptr), тогда это недопустимое условие. Этот сценарий, когда вы освобождаете одну и ту же память дважды, известен как проблема «освобождения памяти дважды».