Какой лучший способ освободить память? - PullRequest
0 голосов
/ 18 июня 2011

Я работаю над ANSI C.

У меня есть строковый объект, созданный с помощью массива char .. Я думаю, что объект делает утечку памяти .. когда я запускаю свою программу около пяти минут (может быть, почти 10000 итераций), моя используемая память становится все больше и больше ..

Я попытался освободить память моего объекта с помощью функции free и delete. но удаление не является допустимой функцией. с другой стороны, free выглядит так, будто сначала работает хорошо. но я получил free():invalid pointer ..

Как я могу это исправить? Я могу сделать это по-другому?


вот немного моего кода ..

char *ext;
ext = calloc(20, sizeof(char));
//do something with ext
free(ext);

Ответы [ 3 ]

1 голос
/ 18 июня 2011

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

calloc(20, sizeof(char))

вы выделяете пространство для 20 символов (19 "обычный" и нулевой терминатор для строк).

Сделайте очень , конечно, ни один из ваших strcat()попробуйте написать «обычные» символы за пределами str[18].

1 голос
/ 18 июня 2011

В C вы выделяете память в куче с malloc, а освобождение с free.Так что вы правы там.delete используется в C ++, и тогда, только если память была выделена с помощью оператора new.

Если вы получаете ошибку неверного указателя при вызове free, то вероятноошибка где-то в коде, если вы опубликуете ее, мы могли бы взглянуть на нее.

0 голосов
/ 18 июня 2011

без кода:

  1. Массив в памяти непосредственно перед тем, что ext указывает на переполнение его хранилища и искажает тип «заголовка», который malloc () использует для отслеживания размера памяти для последующих вызовов free () (представьте себе ((size_t *) ext) [- 1] держит размер из malloc).
  2. Вы использовали отрицательный индекс массива в ext [отрицательный], который сделал то же самое повреждение.
  3. ext как-то модифицируется.
...