2013-05-21 2 views
1

realloc()에 대해 읽는 동안 나는 무시하기보다는 명확히해야 할 몇 가지 의문점을 발견했습니다. 찾았습니다. 명료하게 정리하기 위해 번호를 붙였습니다.이 질문의 길이는 신경 쓰지 마십시오.realloc() 문제 : 이전 블록의 할당 해제, 이전 크기보다 큰 새 크기 및 정적 배열 기본 주소 전달

1)realloc()를 사용하는 동안 그 내용으로 메모리 블록을 새 위치로 이동하는 경우, 나는 다음을 읽은?를 시킴으로 빨리 주소가 우리가()를 무료로 불리는 것처럼 을 해제 도착하지 cplusplusreferencerealloc이지만 원래 메모리 블록이 이러한 경우 할당 취소된다는 제안에 가까워졌지만 귀하의 확인이 필요합니다. 여기

2)

->C90 (C++98)C99/C11 (C++11) Otherwise, if size is zero, the memory previously allocated at ptr is deallocated as if a call to free was made, and a null pointer is returned.

->If the function fails to allocate the requested block of memory, a null pointer is returned, and the memory block pointed to by argument ptr is not deallocated (it is still valid, and with its contents unchanged).

질문이 제기 또 다른 라인입니다 : "If the new size is larger, the value of the newly allocated portion is indeterminate." 여단입니다을, 여기에 내가

을 알고 싶은 것입니다 그것으로 쓸 수 있나요 I) 새롭게 할당 된 부분?

ii) 새로 할당 된 부분을 가비지 값으로 채 웁니까?

3) 그리고 마지막으로, 배열 객체 realloc(-)를 전달하면 형식이 여전히 char* 될 것입니다하지만, 그것은 원본 사이트에 언급, 때문에? 내가 물어 무엇 인수는 "Pointer to a memory block previously allocated with malloc, calloc or realloc. 그것은 것인가되어야한다, I는 그 내용과 메모리 블록이 새로운 위치로 이동하는 경우 realloc() 사용시 free()"If ptr does not point to a block of memory allocated with the above functions, it causes undefined behavior."

+0

나는'cplusplusreference'를 사용하지 말라는 권고를 받았다. 그러나 한 달후 그 사이트에서 메모를하고있는 동안 충고가 최근에 있었다. 전환하는 데 시간이 걸릴 것이다 !! 그리고 글쎄, 그렇지 않다. ** 나쁜 :-) !! – Jugni

답변

8

1) 들어,는 오리지널 어드레스 가져 않는다는 것을 free()의 설명을 읽으면서 너무 UB 여기 될 우리가 free()을 호출 한 것처럼 할당 해제 되었습니까?

예, realloc()이 다른 위치의 포인터를 반환하면 이전 위치는 free d가됩니다.

d realloc이 충분한 메모리 블록을 확보하지 못하고 NULL을 반환하는 경우 d가 아닙니다.

2) 여기에 의문을 제기 다른 라인입니다 : "새로운 사이즈가 큰 경우, 새로 할당 된 부분의 값이 결정되지."음, 여기에 내가

알고 내가) 원하는 것입니다. 새로 할당 된 부분에 쓸 수 있습니까?

예, 물론입니다. 그것은 더 큰 메모리 블록을 재 할당하는 전체 지점입니다.

ii) 새로 할당 된 부분이 가비지 값으로 채워져 있습니까?

메모리 블록의 내용은 이전 블록에서 복사 된 부분을 제외하고는 불확실합니다. 당신은 걱정하지 말아야합니다 무엇 비트가 거기에서 독서하기 전에 거기에 자신의 물건을 넣어.

3) 마지막으로 배열 개체를 realloc()으로 전달하면 어떻게 될까요? 나는 형식이 여전히 char*이긴하지만 인수가 "이전에 malloc, calloc 또는 realloc으로 할당 된 메모리 블록에 대한 포인터가되어야 함"이라는 원본 사이트에서 언급 되었기 때문에 묻습니다. 여기에 UB가 될 것인가? free()

예, malloc, calloc 또는 realloc에 대한 이전 호출에서 얻은되지 않은 realloc에 (NULL 제외) 인수를 전달하는 경우에 대한 (없는 것은 이후 free D 있었던 것) 것을 free()의 설명, 동작은 정의되지 않았습니다.

realloc으로 합법적으로 전달 될 수있는 포인터는 free으로 전달 될 수있는 정확히 동일합니다.

+0

+1 감사합니다. 선생님. 이보다 더 정확한 답변을 드릴지 의심됩니다. 내가 물었던 것을 놓치지 않았습니다. – Jugni