Могу ли я узнать, правильно ли я почистил в С? - PullRequest
1 голос
/ 26 марта 2012

У меня есть код, который выглядит примерно так:

#include<stdlib.h>
#include<string.h>
char** someArray = NULL;
size_t numberOfEntriesInArray = 0;
void addToArray(char* someString){
  someArray = realloc(someArray, (numberOfEntriesInArray+1) * sizeof(char*));
  someArray[numberOfEntriesInArray] = malloc( (strlen(someString) + 1) * sizeof(char) );
  strcpy(someArray[numberOfEntriesInArray], someString);
  numberOfEntriesInArray++;
}
void deleteSomeArray(){
  int i;
  for (i = 0; i < numberOfEntriesInArray; i++){
    free(someArray[i]);
  }
  free(someArray);
}
int main(){
  addToArray( .. );
  ..
  deleteSomeArray();
}

Есть ли способ узнать, что deleteSomeArray сработал правильно?т.е. есть ли способ проверить, есть ли еще больше памяти, которую нужно освободить?

PS

Если я утечка памяти в моей программе, автоматически ли освобождается память, когда моя программа умирает?Если нет, то есть ли способ получить утечку памяти?

Ответы [ 5 ]

6 голосов
/ 26 марта 2012

Есть ли способ проверить, есть ли еще память, которую нужно освободить?

Используйте отладчик памяти . Если вы работаете в Linux (или подобном), то каноническим примером будет Valgrind .

Если в моей программе есть утечка памяти, автоматически ли освобождается память после смерти моей программы?

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

1 голос
/ 26 марта 2012

Если в моей программе есть утечка памяти, автоматически ли освобождается память, когда моя программа умирает?Если нет, есть ли способ получить доступ к утечке памяти?

Ядро ОС автоматически очистит все выделения памяти, открытые файлы, сетевые сокеты и т. Д., Которые ваш процесс открыл приУмирает (независимо от причины, по которой процесс был прерван).

Исключением only является общая память, общие семафоры и функции IPC очереди сообщений, предоставляемые для System V IPC и POSIX.Механизмы МПК;подробности см. ipc(5), msgget(3), semget(3), shmget(3).(Вы могли бы знать, используете ли вы эти механизмы; они не очень распространены. Смотрите утилиту ipcs(1), чтобы легко узнать, какие сегменты общей памяти, общие семафоры и очереди сообщений выделены в вашей системе.)

1 голос
/ 26 марта 2012

Если в моей программе есть утечка памяти, автоматически ли освобождается память при моя программа умирает?

Все современные операционные системы (Linux, Windows OS X, ... Android, ...) очищаются, когда программа (процесс) умирает.

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


Есть ли способ узнать, что deleteSomeArray работал правильно? то есть есть способ проверить, есть ли еще память, которая должна быть освобожденный

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

Не тратьте время на Вальгринда, пока не узнаете, что у вас есть проблема. Если все, что вы хотите знать, «потеряли ли вы указатель, а не освободили его?» И используете ли вы Linux или gcc, вы можете посмотреть на mallinfo . Это функция, которая возвращает структуру, которая, кажется, точно сообщает вам, сколько памяти malloc считает свободным и сколько она стоит. Кажется очень простым, несколько минут усилий.

0 голосов
/ 26 марта 2012

В Windows вы можете использовать функцию _CrtDumpMemoryLeaks. Если вы используете _CrtSetDbgFlag с флагом _CRTDBG_LEAK_CHECK_DF, вы можете сделать так, чтобы отладчик автоматически выплевывал все утечки памяти, используя информацию о номерах файлов и строк. Эти две ссылки содержат гораздо больше информации о типе проверки памяти, которую можно выполнить.

0 голосов
/ 26 марта 2012

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

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

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

При программировании на C (или любом другом языке, который позволяет вам напрямую управлять памятью), вы должны гарантировать, что вы освободили то, что вы выделили, потому что компилятор не скажет вам ничего, ни программу. Кроме того, в стандарте C не существует никакой функции для предоставления вам этой информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...