2011-11-08 2 views
4

이것은 매우 쉬운 해결책이 있어야하는 것처럼 보입니다. 그러나 나는 그것을 알아낼 수 없습니다. 난 단순히 크기가 조정 된 배열을 만들고 모든 원래 값을 복사하려고 시도하고, 마지막으로 메모리를 확보하기 위해 이전 배열을 삭제하려고합니다. 여기에서 일어나고있는 것 같다 무엇하나의 동적으로 할당 된 배열에서 다른 C++로 복사

void ResizeArray(int *orig, int size) { 
    int *resized = new int[size * 2]; 
    for (int i = 0; i < size; i ++) 
     resized[i] = orig[i]; 
    delete [] orig; 
    orig = resized; 
} 

내가 delete [] orig을 주석 처리하지 않는 한이 반환 정크 값의 무리를 끌어다 후 resized[i] = orig[i] 인쇄 오리지널로, 오히려 값보다 참조로 값을 복사하는 것입니다. 원본에서 크기를 변경하거나 다른 문제가 있습니까? 나는 std :: vector를 사용하고 싶지 않다.

+0

"참조로 값 복사"와 같은 것은 존재하지 않습니다. 동일한 데이터에 대한 새로운 참조를 만들거나 복사 중입니다. –

+2

'std :: vector'를 사용하지 않으려는 경우에도 클라이언트가 불변 객체를 전달할 수 있고 구현 포인터가 변경된다는 사실을 관리 할 필요가 없도록 클래스에서 이것을 래핑함으로써 많은 이득을 얻을 수 있습니다 모든 크기 조정. : -/ – HostileFork

답변

7

C++의 매개 변수는 값으로 전달됩니다. 전달 된 포인터의 복사본resized을 할당하면 함수 외부의 포인터는 그대로 유지됩니다.

void ResizeArray(int **orig, int size) { 
    int *resized = new int[size * 2]; 
    for (int i = 0; i < size; i ++) 
     resized[i] = (*orig)[i]; 
    delete [] *orig; 
    *orig = resized; 
} 

또는 포인터에 대한 참조 :

void ResizeArray(int *&orig, int size) { 
    int *resized = new int[size * 2]; 
    for (int i = 0; i < size; i ++) 
     resized[i] = orig[i]; 
    delete [] orig; 
    orig = resized; 
} 

당신은 (int에 대한 포인터로, 즉 포인터 또는 "이중 포인터") 이중 간접를 사용해야 하나 그런데 배열 크기의 경우 std::size_t<cstddef>에서 사용해야합니다. 이는 모든 객체의 크기를 유지하고 객체의 크기를 처리한다는 것을 분명히합니다.

+1

+1 다른 옵션은 ... 반환 값을 사용하여 새 배열을 반환하는 것입니다. –

+0

@ AndréCaron : 그 역시 옵션이지만,이 양식이 들여 쓰기 용도에 더 적합하다고 생각합니다. –

+0

설명의 요점으로, "이중 포인터"로 응답자는 "이중 간접 지정"을 의미합니다. 처음 읽었을 때, 왜 int *에'double * '을 쓰려고하는지 혼란 스러웠다. –

2

origresized에 할당에 대한 포인터에 대한 포인터이어야합니다

int **orig; 
*orig = resized; 
3

내가보기 엔 std::vector<int>으로 배열을 교체하는 것이 좋습니다. 이 데이터 구조는 필요에 따라 크기가 조정되고 크기 조정은 이미 테스트되었습니다.

+1

동의합니다. 그러나 답변이 아니라 주석이어야합니다. –

+0

나는 이것에 동의하지만, 무의미 함은 위대한 운동이다. –