2014-03-12 2 views
1

문자열의 부분 해제 어레이 I는 예를 들어, 이미 free되기를 일부되는 문자열의 배열을 가지고 있다고 가정 ? 나는 여전히 메모리 누수가있는 것 같기 때문에, 내 경우에있어서 은 이미 9 개가 해제 된 20 개의 문자열 배열이다.무료() C

"해제 된"문자열을 해제하는 방법은 궁금합니다. 도움에 감사드립니다!

+0

이 컴파일 않는다 (위와 동일하지만,이 NULL에 해제 변수를 강제로 포함되어 있음을 의미) :

char **array=NULL; //(Helps you to give it an initial value pointing to NULL) array = malloc(arr_size+1); if (!array[i]) { // array == NULL which is not right after malloc // there has been an error with malloc, trap and exit somehow } else { // Use array as you wish as it has been allocated, take care not to // run past the end of the array length } if (array[i]) free(array[i]); // checks that it is not NULL anymore, as NULL does not need freeing. 

당신은로 IF 문을 확장 할 수 더 나은 것입니까? 배열의 선언은 무엇입니까? –

+0

char ** 배열; array = malloc (20 * sizeof (char *)); – Pavoo

+0

그래서 작은 따옴표가 붙은 이유는 무엇입니까? –

답변

2

"해제 된"문자열을 해제하는 방법은 궁금합니다.

글쎄, 그렇지 않아. free마다 malloc을 정확하게 입력해야합니다. 동일한 문자열에서 free을 여러 번 호출하면 정의되지 않은 동작이 발생합니다. 여기

array[i]='\0'; 

, 당신 free 그 전에 포인터의 값을 덮어 쓰는 : 제쳐두고, 당신의 문제는 다음이다

.

+0

또한 array [i]가 malloc되지 않았습니다. 배열 만 malloc되었습니다. 그것을 풀면 아마도 충돌이 발생할 것입니다. – cup

+1

... 그리고 문자열이 아닌 문자가 할당되었습니다 –

0

1 malloc() 할당하려면 메모리를 할당 해제하려면 1 free()이 필요합니다. 따라서 free(array);은 메모리를 할당 해제하기에 충분합니다.

free() 메모리 할당 해제는 malloc()을 사용하여 할당 된 메모리와 동적으로 대응합니다.

+0

아니요. 'free (array)'는 '메모리 할당 해제'를하지 않고 단지 포인터의 배열을 해제하지만 배열의 항목이 가리키는 문자열은 해제하지 않습니다. – CiaPan

1

일반적으로 free- 이후 포인터는 NULL으로 설정해야합니다. 그런 다음 포인터가 NULL인지 확인해야합니다. 그렇지 않으면 free 수 있습니다. 그렇게하면 어떤 것이 free -ed인지 어느 것이 없는지 추적 할 수 있습니다.

+2

Freeing 할 때'NULL'을 확인하지 않아도 free (NULL)는 무해합니다. – sth

+0

정말요? 그건 나에게 처음이다. – tlehman

+0

7.22.3.3/2에서 [이 표준 초안] (http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf)을 참조하십시오 : "'ptr '이 null 포인터, 아무런 작업도 발생하지 않습니다. " – sth

0

무료 (array [i]); 이전 행에서 값 (포인터)을 변경 한 포인터를 해제하려고 할 때 문제/이상한 오류가 발생합니다.

코드 array [i] = '\ 0';

은 문자 값이 아닌 포인터 값을 설정하므로 원하는 결과를 얻지 못할 수 있습니다. 아마도 sprintf (array [i], "\ 0");

if (array[i]!=NULL) 
{ 
free(array[i]); 
array[i] = NULL; 
}