문제

친구

에서 우리의 C++,Iam 현재 사용하여 realloc 방법을 조정 할당된 메모리에 의해 malloc.realloc()사용법은 아래와 같이

my_Struct *strPtr =(my_struct*)malloc(sizeof(my_Struct));

/* an later */

strPtr = (my_struct*)realloc(strPtr,sizeof(my_Struct)*NBR);

지금 wikipeadia(_http://en.wikipedia.org/wiki/Malloc)는 것을 말한

면을 대신하지 않았다

void *p = malloc(orig_size);

/* and later... */

p = realloc(p, big_size);

그런 다음 경우에는 그것을 얻을 수 없 big_size 바이트의 메모리,p 이 있을 것이 값은 NULL 이 아니고 우리는 더 이상의 포인터를 메모리는 이전에 할당한 p 을 만들고,메모리 누수

그리고 그것은 또한 말한다 올바른 방법으로 조정하는 위에 오류가입

void *p = malloc(orig_size);

/* and later... */

void *tmp = realloc(p, big_size); 

if (tmp != NULL)
 {

p = tmp; /* OK, assign new, larger storage to p */

} 

else 

{

/* handle the problem somehow */

}

당신은 내게 말할 수 있는 가장 좋은 방법을 사용하 realloc()

또한 한 번 나는 포인터를 구조한 다음을 사용하는 동안 realloc 나중에 사용할 수 있는 포인터를 무효???

많은 감사

도움이 되었습니까?

해결책

물론 당신은에 대하여 보호해야 합는 경우 realloc()NULL.그것은 메모리 할당 및 C(가 realloc() 인)주로 사용되는,나는 생각한 C++프로그래머의 생각은 조금 낮은 수준의/qaint 을 사용하여 원 realloc() 전화,메모리 할당은 항상 실패합니다.

바로 덮어쓰는 포인터를 반환하는 값에는 오류는 원래 포인터와 메모리 누수는 경우에 재 할당하지 못했습니다.

다른 팁

Malloc()및 realloc()은 C 함수입니다.실제로,realloc()는 malloc()및 무료()에 따라 인수를 통:

  • 전달할 경우 null pointer,realloc 무엇 malloc 않습니다.
  • 는 경우에 당신은 그것을 전달할 제로 크기,realloc 는 무료 무엇 않습니다.

인용 , 당신은 깊은 설명이 있습니다.

C 라이브러리가는 것이 불가능을 확장하는 메모리 블록에 위치,그래서는 C++지원하지 않는다.

하려는 경우 지팡이를 C 함수,다음을 보유해야 포인터가 당신의 첫 번째 메모리 할당 호출할 때 realloc().음을 확인하는 경우 NULL,그렇지 않으면 당신은 할당,다만에서했던 것처럼 당신의 latst 코드입니다.

그러나 어쩌면 C++최고의 솔루션을 mallocator,std 솔루션에 따라 C malloc().체크 , 나 .

를 사용하여 제안된 접근 방식을 개최로 포인터를 이전할 때까지 버퍼 realloc 성공적으로 반환됩니다.한 realloc()성공적으로 반환합니다 이전 블록 해제하고 포 그가 매달려 조정합니다.

realloc 뿐만 아니라 malloc 걱정하지 않은 무엇이 포인터 타입 사용할 수 있습 void*뿐만 아니라 아무것도*.

다른 사람처럼 말했듯이,단지 사용 realloc 제대로 권장합니다.

그러나"C++방법으로"이렇게 하는 정말 사용하는 std::벡터<>보다 유지하는 배열을 자신입니다.는 방법으로 C++표준 라이브러리를 돌봐 낮은 수준에서 정보의 재할당(아마도를 사용하여 realloc()).

때 realloc()가 실패하고 NULL 을 반환합니다 원래의 메모리 훼손되지 않은 것입니다.
그래서 당신은 그것을 사용해야 하는 다음과 같다:

my_Struct* strPtr =(my_struct*)malloc(sizeof(my_Struct));

/* an later */

my_Struct* tmp = (my_struct*)realloc(strPtr,sizeof(my_Struct)*NBR);
if (tmp != NULL)
{
    strPtr = tmp;
}
else
{
    /* realloc Failed. Need to do something */
}

왜 당신이 사용하는 malloc 및 realloc?거의 항상 더 나은 방법에서는 C++.

만약 당신이 그것을 사용하여 변 길이 배열을,당신은 거의 확실히 더 나은 떨어져 가는 std::벡터<>,또는 아마도 하나의 다른 컨테이너 템플릿이 있습니다.

만약 당신이 사용하는 C 의 대신으로,아마,C++이 가능한 컴파일러,다음에 올바른 방법은 두 번째 방법을 잃지 않는다는 전체 메모리 블록 실패할 경우를 할당합니다.

의 두 번째 질문에 대한 답도에 따라 달라지는지 여부를 당신을 사용하여 C 또는 C++.C,void*일반적인 포인터가 가리키는 형식,그리고 자유롭게 컨버터블이다.에서는 C++,void*을 명시적으로 변환됩니다.는 경우에 당신은 실제로는 C,당신은 당신을 사용할 필요가 malloc()그리고 친구는 작업에 void*.만약 당신이 진짜로 쓰는 C++,당신은 필요 캐스트,어느 것이 더 어색하다.어느 경우에는 realloc()작업에서 포인터 구조체이지만,오히려는 포인터를 무효입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top