2017-10-28 4 views
0

저는 C++ 메모리 관리에 대한 책을 읽었습니다. 세부 사항이없고 잘 설명해줍니다. 그러나 나는 지금까지 해왔 던 프로그램을 가지고있다. 정말 큰 벡터 나 배열을 처리해야한다. 나는 혼란 스럽다. 나는 단지 대소 문자를 메모리에 할당하려고 결심했다.Malloc이 X 바이트를 할당하지 못하는 경우 Realloc을 사용하거나 Malloc을 다시 사용합니까? C++

제 질문은 malloc()에 일정량의 데이터를 넣으려고하면 문제가 발생합니다. malloc()을 다시 실행하고 더 적은 데이터를 할당하려고 시도하면 realloc()을 사용합니까, 아니면 malloc()을 다시 사용합니까? 나는 처음의 malloc()가 실패 할 것이기 때문에 그것이 어리석은 질문처럼 들린다 고 생각한다, 전혀 malloced하지 않을 것이다. .. ??? 당신은 여전히 ​​그것에 malloc()를 사용할 수 있어야한다는 것을 의미합니까?

그래서 ... 어떤 것을 사용합니까? 아니면 다음 중 하나도 사용하지 않습니까? 첫 번째 malloc()이 실패 할 경우

BYTE *allocptr; 
allocptr = (BYTE*)malloc(2500000); 
if (!allocArray) 
{ 
    allocptr = (BYTE*)malloc(1000000); 
} 
// program code 
free(allocptr); 

아니면 바이트의 적은 양을 사용해 realloc()를 사용해야합니다 ... 는 대신 다시 malloc()를 시도? 첫 번째 malloc()이 allocptr이 NULL과 동일했다 경우 allocptr 동일 NULL ... 난에 malloc()를 사용하지 수없는 것이다 2,500,000 바이트를 할당하지 않을 경우 때문에

BYTE *allocptr; 
allocptr = (BYTE*)malloc(2500000); 
if (!allocptr) 
{ 
    allocptr = (BYTE*)realloc(allocptr, 1000000); 
} 
// program code 
free(allocptr); 

나는이 질문을 부탁 해요 이유는 그것은 realloc() 대신에 realloc()이 NULL과 같은 포인터를 가질 수 없다고 생각했기 때문입니다.

+0

c++ realloc 당신은 무엇을 [realloc을 (HTTP에 대해 혼동하는 것 : // WWW. cplusplus.com/reference/cstdlib/realloc/)가 있습니다.메모리 블록이없는 경우 메모리 블록의 크기를 변경할 수 없습니다. – tkausl

+0

@tkausl 네, 제가 읽고있는 책에서 읽었던 사실은 NULL이나 그와 비슷한 realloc 포인터를 사용할 수 없다는 점입니다. 도움을 주셔서 감사합니다. – MAXBD

+0

'realloc'은 코드가 작동하지 않을 수 있도록 2 개의 매개 변수 (포인터와 크기)를 사용합니다. –

답변

1

Realloc은 할당 된 블록 또는 메모리의 크기를 변경합니다 (또는 새 블록을 할당하고 이전 내용을 복사 함). 예를 들어, 5 바이트의 메모리를 할당 한 다음 나중에 5 바이트가 더 필요할 때이를 사용합니다. malloc이 실패 어디에 경우

는, 당신은 시작하기 메모리의 블록을 없었어 , 그래서 당신은 malloc를 사용하는 것, 그래서 재 할당하는 것은 없다.

참고 : @DavidSchwarz 언급했듯이 realloc을 사용하지만 첫 번째 매개 변수가 NULL 인 경우 malloc을 호출하는 것과 같습니다.

+0

실제로 질문에 대답하지 않았습니다. 대답은'malloc' 또는'realloc' 둘 다 사용할 수 있기 때문에 둘 다 새로운 메모리 블록을 할당하는 데 사용할 수 있기 때문입니다. –

0

여기에는 두 가지가 있습니다. 첫 번째 문제는 실패한 malloc()의 동작과 관련이 있습니다. malloc()이 작동하고 메모리 블록에 대한 포인터를 반환하거나 메모리를 할당하지 못하고 null 포인터를 반환합니다. (두 번째 경우에는 "최선을 다하는 것"과 요청한 양보다 적은 값을 할당하는 것과는 달리 메모리가 할당되지 않습니다.)

둘째는 realloc과 malloc 사이의 가능한 유사점입니다. 오류 사례. realloc()은 다른 것들 중에서, 이전에 malloc()에 의해 할당 된 메모리 블록에 대한 포인터를 취합니다. 그러나 포인터가 null 일 경우 realloc()은 정확히 malloc()과 동일하게 작동하고 새 블록이 할당됩니다. (그리고 realloc() 호출이 실패 할 경우, 반환은 malloc()처럼, 널 포인터입니다.)

참고 문헌 : c++ malloc