2013-03-27 2 views
0

여기에서 많은 주제를 검색했지만 정확하게 대답하지 않은 것 같습니다.배열의 내용을 C++의 크기가 조정 된 배열에 복사

C++에서 동적 재 할당 배열을 수행하려고합니다. STL (vector, ...)이 명시 적으로 금지되어있는 숙제에서 이것을 사용해야 할 때 STL 라이브러리의 어떤 것도 사용할 수 없습니다.

int * items = new int[3]; //my original array I'm about to resize 
int * temp = new int[10]; 
for (int i = 0; i < 3; i++) temp[i] = items[i]; 

delete [] items; //is this necessary to delete? 
items = new int [10]; 
for (int i = 0; i < 10; i++) items[i] = temp[i]; 
delete [] temp; 

이 작동하는 것,하지만 날 귀찮게하는 것은 반복의 과도한 번호 :

는 지금까지, 나는 다음과 같은 코드로 정교하게 시도했습니다. 아무리 똑똑해도 끝날 수 없습니까? 분명히, 나는 이것보다 훨씬 더 큰 배열로 작업하고있다. 불행하게도, 은 배열을 사용하여해야합니다.

편집 : 내가 items = temp; 대신

for (int i = 0; i < 10; i++) items[i] = temp[i];을하고 std::cout 내 모든 요소를하려고 할 때, 나는 처음 두 요소를 잃는 결국,하지만 제대로 Valgrind의 인쇄를.

+0

숙제를 할 때, 더 똑똑한 것은 그것을 캡슐화하는 것입니다. 즉, std :: vector의 부분을 다시 작성해야합니다. "stl"의 정의에 따라 다음을 사용할 수 있습니다. std :: copy와 같은 것들이 복사 과정을 캡슐화합니다. – PlasmaHH

+0

포인터가 일반 변수이므로 다시 할당 할 수 있습니다 ... –

+2

C++을 만진 이후로 잠시 동안, [] []을 temp []로 복사 한 다음 temp [] abck에서 items []로 복사해야합니까? items [] -'int * temp = items; '에 대한 새로운 포인터를 만들 수는 없습니까? item - new int [10]'. 'temp'에서'items'까지 복사본을 만드십시오 - 아마 memcopy' 함수 나'std :: copy' 함수를보십시오. 그런 다음 'temp'를 삭제하십시오. – wmorrison365

답변

5

예, 먼저 delete[]이 필요합니다. 그것 없이는 기억이 새어 나올 수 있습니다.

: 당신은 그냥 채워 한 열 요소의 배열에 items 지점을 만들 것

items = temp; 

이 :

은 첫 번째 delete[] 다음에 오는 코드에 따라 그것의 모두 교체 할 수 있습니다

int * items = new int[3]; //my original array I'm about to resize 
int * temp = new int[10]; 
for (int i = 0; i < 3; i++) temp[i] = items[i]; 
delete [] items; //delete the original array before overwriting the pointer 
items = temp; 

마지막으로 어레이 작업이 완료되면 delete[] items;을 잊지 마세요.

+0

이상하게 들었어,'items = temp; '에 약간의 오류가있었습니다. 나는 어떻게 든 처음 두 요소를 잃어 버렸다. – Saraph

+0

@NPE 시퀀스가 ​​섞이지 않았습니까? 그것을 설명하는 것보다 코드를 적어 두는 편이 좋다. – 4pie0

0

STL의 용기는 이와 같이 작업하기 쉽도록 만들어졌습니다. 지루하지만, C - 어레이를 사용해야하는 경우에는 선택의 여지가 거의 없습니다.

delete [] items; 

의 삭제가 필요로 당신은 메모리 누수의 원인이됩니다

items = new int [10]; 

에 새로운 참조를 할당 함께 할 것입니다 배열에 대한 참조를 포기하는 경우, 그래서 이것이 필요합니다.