2016-08-30 6 views
1

구조체 s1의 배열 (힙 상)에 포인터 p1이 있다고 가정합니다. 각 구조체 s1에는 힙에있는 다른 구조체 s2에 대한 포인터도 있습니다. 크기를 조정하기 위해 p1에 realloc()을 호출하면 미리 할당 된 배열의 구조체가 보유하고있는 이전 메모리가 해제됩니까 (힙의 s2s)?realloc()은 오래된 메모리를 해제합니까? (오래된 메모리가 다른 메모리에 대한 포인터 일 때)?

문서에 if the area pointed to was moved, a free(ptr) is done이라는 문구가 있기 때문에이 질문에 대한 대답은 하나의 레벨까지만 허용된다는 의미입니다. 그 맞습니까? 그리고 그렇다면 가장 좋은 해결책은 수동으로 새로운 배열을 malloc하고, 이전 배열을 반복하고, 새로운 큰 배열에 값을 복사하고, 구조체를 해제하는 것입니다.

+2

'free()'는 포인터가 가리키는 객체의 종류를 알지 못합니다. 결과적으로, * 재귀 적으로 구조체의 포인터를 자동으로 free() 할 수 없습니다. – EOF

+0

귀하의 질문은 일종의 수수께끼입니다. 블록을 *보다 크게 만들려고한다면 왜 더 작은 블록을 제외하고는 아무 것도 자유롭게해야합니까? 블록을 더 작게 만들려고하는 경우 질문에 의미가 있습니다. –

+0

@DavidSchwartz 크기를 조정하기 위해 단어를 수정했습니다. 처음에는 확대 요소를 썼습니다. 이전 요소를 새 위치로 복사하면 이전 요소가 사라지지 않는 경우가있을 수 있다고 생각했기 때문입니다. 그러나, 되돌아 보면, 나는 이것이 사실 일 수 있다고 생각하지 않습니까? – gowrath

답변

1

realloc()은 사용자가 지정한 최상위 배열 만 재 할당합니다. EOF는 주석에서 언급했듯이 배열의 내용이 포인터라는 것을 알지 못하므로 해당 요소에는 아무 것도 할 수 없습니다.

배열을 확대하는 경우 해당 배열이 가리키는 배열을 사용하지 않아도됩니다. 그들의 메모리는 변경되지 않고 포인터는 이전 메모리에서 realloc()에 의해 할당 된 새 메모리로 복사됩니다.

배열을 축소하는 경우 메모리가 누출되지 않도록 결과의 끝을 벗어난 요소가 가리키는 배열을 먼저 비워야합니다.

2

아니요, realloc은 (는) 레벨 1을 무료로 제공 할 수 있지만 더 이상 제공하지는 않습니다. 구조체 내부에서 포인터를 해제하지 않습니다. 나는 배열이 성장할 수 있고 움직이지 않으면 동일한 장소에서 단순히 자랄 것이므로 자유롭게 할 수 있다고 말했다.

당신이 제안하는 대안은 realloc이 장면 뒤에서하고있는 일종의 종류입니다 (우리가 여전히 배열을 확대하는 것에 대해 이야기하고 다른 구조 작업이 아니라고 가정 할 때). 일반적으로 당신이 좋은 이유가 없다면 (그리고 당신은 가지고 있지 않은 것 같으면) 표준 라이브러리를 사용하십시오.

1

대답은 '아니오'입니다. Realloc works는 다음과 같습니다 :

realloc은 기존 포인터를 사용하거나 이전 포인터를 축소하거나 확장 할 수없는 경우 새 포인터를 할당합니다. 새 포인터가 할당되면 이전 위치의 내용이 새 위치에 맞게 복사됩니다.

realloc이 메모리 블록을 축소하면 새 블록의 모든 s1 포인터가 유효하지만 s1 포인터가 새 메모리 블록을 초과하면 s1 포인터도 s2 포인터가 해제되었습니다. 메모리 누수를 피하려면 realloc을 호출하기 전에 그들이 가리키는 메모리를 해제해야합니다.

realloc에서 알아 두어야 할 또 다른 사항은 null을 반환하면 이전 메모리 포인터가 여전히 유효하므로 복사본을 유지하고 실패시 다시 사용하거나 해제해야한다는 것입니다.