Насколько я понимаю, эта память должна была очиститься, не так ли?
Извините, но вы ошиблись.:) Память, выделенная с помощью malloc()
, будет сохраняться до тех пор, пока вы не удалите ее вручную с помощью free()
.(Вы действительно получили это правильно в конце концов. Ура.:)
Это правильный способ освободить эту память?Могу ли я освободить эту память?
То, что является правильным способом освобождения памяти, но может быть не в правильном месте .В общем, старайтесь писать свои звонки free()
одновременно с написанием звонков malloc()
.
Может быть, вы выделяете в начале функции, а затем освобождаете в конце функции.(В этом случае использование памяти в стеке может быть лучше, если память когда-либо используется только функциями, вызываемыми исходной функцией.)
Возможно, у вас есть foo_init()
функция, которая вызывает malloc()
исоздает связанные контексты из API, затем вы передаете этот контекст в другие подпрограммы, которые работают с этими данными, а затем вам нужно поместить вызовы free()
в foo_destroy()
или foo_free()
или аналогичную подпрограмму.Затем все ваши абоненты должны сбалансировать вызовы foo_init()
и foo_free()
.Это было бы особенно уместно, если вы не можете просто написать вызовы foo_init()
и foo_destroy()
в одной функции;скажем, ваши объекты, возможно, должны быть удалены в некоторой случайной точке в более крупном цикле событий.
И, возможно, данные должны быть распределены один раз и жить вечно.Это было бы правильно для некоторых проектов приложений, и по именам переменных трудно сказать, должны ли эти блоки данных жить вечно.
Может быть, есть другая причина ошибки сегментации, кромеC не правильно отказался от памяти после последнего вызова, или Matlab неправильно управляет своей памятью?
Конечно, может быть;возможно, эта память возвращается слишком рано, возможно, какой-то указатель free()
редактируется два или более раз, или вы перезаписываете свои буферы (этот вызов malloc(sizeof(Nav_str))
немного беспокоит; вероятно, он просто выделяет four или восемь байт, в зависимости от размера указателя на вашей платформе, и прежде чем заменить его на strlen()
, обратите внимание, что strlen()
не оставит место для байта NUL
вконец строки; malloc(len+1);
- это обычный шаблон для выделения памяти для строки, и меня беспокоит каждый раз, когда я не вижу, что +1
в вызове.)
Некоторое время с valgrind
, несомненно, поможет найти ошибки памяти, и, возможно, какое-то время с Electric Fence может помочь.valgrind
определенно новее и определенно может лучше обрабатывать «большие» программы (поскольку электрический забор будет выделять новую страницу для каждого malloc()
, это может быть дорого).