C - освобождение памяти кучи, выделенной в другом файле - PullRequest
0 голосов
/ 13 августа 2011

Если у вас есть проект, использующий make-файл, который компилирует несколько файлов и заголовков, это усложняет кучу?

В частности: У меня есть файл main.c, который содержит заголовок, скажем test.h. В test.c, который связан с test.h память выделяется явно с помощью malloc. main.c вызывает функции в test.c. Почему-то, когда я пытаюсь освободить память внутри функций в test.c, я всегда получаю сообщение об ошибке:

main(65245) malloc: *** error for object 0x106d012f8: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug
Abort trap: 6

... эта ошибка возникает, хотя я никогда, ни разу не освобождаю память вообще во всем стеке make-файлов. Очевидно, stdlib.h включено. Что может происходить? Существуют ли отдельные кучи для main.c и test.c, и когда последний вызывается и возвращается результат, выделенная память кучи уже освобождается? Я действительно в тупике. Я могу выделить и освободить память в main.c без каких-либо проблем. Они включают в себя то же самое.

Ответы [ 3 ]

4 голосов
/ 13 августа 2011

нет такой вещи как «разные файлы» во время выполнения.все файлы объединены в один большой двоичный код при связывании.Таким образом, поэтому, очевидно, есть только одна куча.
ваша проблема должна быть в чем-то другом, поскольку вы никогда не освобождали память, возможно, вы пытаетесь освободить статическую выделенную память или что-то в этом роде

также обратите внимание, что существует соглашение, которое обычно довольно хорошопредотвратить утечки памяти, что говорит: часть программы, которая выделяет память, также несет ответственность за ее освобождение.Он не связан напрямую с вашим вопросом, но в будущем будет полезно попытаться сделать это, чтобы предотвратить утечки памяти.

2 голосов
/ 13 августа 2011

Вы освобождаете один и тот же адрес / указатель в каждом файле?Да, вы получаете 1 кучу, если вы специально не пытаетесь получить несколько куч.Я предполагаю, что вы не освобождаете один и тот же указатель - возможно, какая-то ошибка адресации / двойного указателя.Вы должны опубликовать некоторый исходный код для нас, чтобы быть уверенным ...

1 голос
/ 13 августа 2011

Все вызовы malloc () выделяются из одной и той же кучи, независимо от того, из какого файла вы их вызываете. Вы освобождаете указатель, который не пришел ни от какого вызова malloc ().

Внимательно проверьте ваш код, распечатайте выделенные и освобожденные значения указателя для журнала отладки.

...