2012-03-06 4 views
2

가능한 중복 :
How do you realloc in C++?C++ 배열의 메모리 재 할당.

나는 C++ 배열 재 할당 될 수 있다는 것을 알고는 (확장) 메모리가 malloc() 또는 calloc()를 통해 할당 된 경우 realloc()를 사용하여. 내 질문은, 어떻게 내가 C에서 메모리를 new 연산자를 통해 할당되었습니다 배열을 확장 할 수 있습니까?

+0

malloc/realloc은 C 라이브러리 호출입니다. C++에서 사용할 수 있지만 C++에는 동적 배열 등을 다루는보다 강력한 방법이 있으므로 일반적으로 피해야합니다. –

답변

11

C++에서는 std::vector<>을 사용합니다.

이렇게하려면 새 배열을 new을 통해 할당 한 다음 이전 항목을 (예 : std::copy)에 복사 한 다음 이전 배열 delete[]에 복사해야합니다.

그냥 std::vector을 사용 - 당신을 위해 모든 물건을 할 수 있도록 ...

+3

+1 for'std :: vector'. –

+1

"이전 항목을 복사하십시오"- 또는 이동하십시오. –

4

일반적으로 malloc으로 저장소가 할당 된 경우에도 C++ 배열은 realloc으로 재 할당 할 수 없습니다. malloc은 배열을 제공하지 않습니다. 사용 가능한 저장소에 대한 포인터를 제공합니다. 여기서 미묘한 차이점이 있습니다.

POD 유형의 경우 사용 가능한 저장소와 실제 개체간에 약간의 차이가 있습니다. 그러나 POD가 아닌 유형의 경우 사용 가능한 저장소와 개체는 완전히 다른 것입니다.

realloc은 사용 가능한 저장 공간의 상당 부분을 제공합니다. 이 아닌 개체을 조작합니다. POD 유형에서는 문제가 없지만 다른 유형에서는 재난을 대비합니다.

+0

기술적으로'calloc()'을 사용하여 할당 한'realloc()'또는'malloc()'을 통해 메모리를 할당 한 경우에만'realloc()'을 사용하여 배열을 확장 할 수 있습니까? –

+0

@amalantony 아, calloc에 ​​대해서도 마찬가지입니다. 문제는'realloc' 자체에 있습니다. 객체에만 신경 쓰지 않고 저장에만 관심이 있습니다. –

+0

@amal :'malloc'과'calloc'의 차이점은 마틴호가 여기서 말하는 것과는 전혀 무관합니다. non-POD 객체를'realloc '할 수 없다. 왜냐하면 당신은 그것들을 바이트 단위로 복사 할 수 없기 때문이다.'realloc'은 그렇게하도록 정의되어있다. C에서조차도, 당신의 객체가 그들 자신이나 서로에게 포인터를 포함한다면, 주소가 더 이상 정확하지 않기 때문에 당신은 그것들을'realloc '할 수 없다. C++은 POD가 아닌 클래스의 경우 구현 자체가 그와 같은 것을 삽입 할 수 있다는 경고를 추가합니다. –