나는 C++ 배열 재 할당 될 수 있다는 것을 알고는 (확장) 메모리가 malloc()
또는 calloc()
를 통해 할당 된 경우 realloc()
를 사용하여. 내 질문은, 어떻게 내가 C에서 메모리를 new
연산자를 통해 할당되었습니다 배열을 확장 할 수 있습니까?
답변
C++에서는 std::vector<>
을 사용합니다.
이렇게하려면 새 배열을 new
을 통해 할당 한 다음 이전 항목을 (예 : std::copy
)에 복사 한 다음 이전 배열 delete[]
에 복사해야합니다.
std::vector
을 사용 - 당신을 위해 모든 물건을 할 수 있도록 ...
+1 for'std :: vector'. –
"이전 항목을 복사하십시오"- 또는 이동하십시오. –
을 사용 ::std::vector
.
자세한 내용은 this question 또는 this question을 참조하십시오.
일반적으로 malloc
으로 저장소가 할당 된 경우에도 C++ 배열은 realloc
으로 재 할당 할 수 없습니다. malloc
은 배열을 제공하지 않습니다. 사용 가능한 저장소에 대한 포인터를 제공합니다. 여기서 미묘한 차이점이 있습니다.
POD 유형의 경우 사용 가능한 저장소와 실제 개체간에 약간의 차이가 있습니다. 그러나 POD가 아닌 유형의 경우 사용 가능한 저장소와 개체는 완전히 다른 것입니다.
realloc
은 사용 가능한 저장 공간의 상당 부분을 제공합니다. 이 아닌 개체을 조작합니다. POD 유형에서는 문제가 없지만 다른 유형에서는 재난을 대비합니다.
기술적으로'calloc()'을 사용하여 할당 한'realloc()'또는'malloc()'을 통해 메모리를 할당 한 경우에만'realloc()'을 사용하여 배열을 확장 할 수 있습니까? –
@amalantony 아, calloc에 대해서도 마찬가지입니다. 문제는'realloc' 자체에 있습니다. 객체에만 신경 쓰지 않고 저장에만 관심이 있습니다. –
@amal :'malloc'과'calloc'의 차이점은 마틴호가 여기서 말하는 것과는 전혀 무관합니다. non-POD 객체를'realloc '할 수 없다. 왜냐하면 당신은 그것들을 바이트 단위로 복사 할 수 없기 때문이다.'realloc'은 그렇게하도록 정의되어있다. C에서조차도, 당신의 객체가 그들 자신이나 서로에게 포인터를 포함한다면, 주소가 더 이상 정확하지 않기 때문에 당신은 그것들을'realloc '할 수 없다. C++은 POD가 아닌 클래스의 경우 구현 자체가 그와 같은 것을 삽입 할 수 있다는 경고를 추가합니다. –
malloc/realloc은 C 라이브러리 호출입니다. C++에서 사용할 수 있지만 C++에는 동적 배열 등을 다루는보다 강력한 방법이 있으므로 일반적으로 피해야합니다. –