2011-10-06 3 views
2

동적 메모리 배열을 확장하는 방법이 있습니까? 다음과 같이하십시오 :C++에서 동적 메모리 배열을 확장하는 방법이 있습니까?

int *a = new int[5]; 
*a = new int[2]; 

이것은 합법적입니까?

+0

이 코드에서 기대할 수있는 점이 무엇입니까? – sth

+4

확실하다. 그 코드는 합법적이다. 아마 당신이 생각하는 것을하지 않을 것이다. – Bwmat

+9

'std :: vector '을 사용하십시오. – GManNickG

답변

9

이 유형의 동적 메모리 배열은 확장 할 수 없습니다. mallocrealloc을 사용할 수 있지만이 기능이 필요하다면 그 대신에 조언을하고 <vector>을 포함하고 std::vector을 사용하는 것이 좋습니다. 그것에는 resize 방법이 있습니다.

또한 설명 된 내용은 컴파일되지 않습니다. 다음은 수행 할 것입니다 :

1: int *a = new int[5]; 
2: a = new int[2]; 

위의 두 메모리 블록은 모두 소멸되지 않습니다. 두 번째 줄은 새로운 배열을 동일한 int *a 포인터에 할당합니다. 할당 된 메모리가 포인터에 의해 참조되는 것을 멈 추면 이것을 메모리 누수라고합니다. 위의 코드는 new int[5]에 대한 참조를 잃었으므로이 메모리를 운영 체제에서 비울 방법이 없습니다.

매우 실용적인 예는 아니지만 배열/벡터의 크기를 조정하는 방법은 여러 가지가 있습니다. 이 배열의 크기를 증가하는 것이 실용적으로 , 난 그냥이 작업을 수행합니다 : realloc 스마트 아무것도하지 않습니다 가치가

{ // C++ vector on the stack (although internally vector uses memory from the heap) 
    std::vector<int> a(1024); 
    // do smth 
    a.resize(4096); // note: this does not always reallocate 
    // do smth else 
} 

{ // C++ everything on the heap 
    std::vector<int> *a = new std::vector<int>(1024); 
    // do smth 
    a->resize(4096); // note: this does not always reallocate 
    // do smth else 
    delete a; 
} 

{ // C style 
    int *a = (int*)malloc(1024*sizeof(int)); 
    // do smth 
    a = realloc(a, 4096*sizeof(int)); 
    // do smth else 
    free(a); 
} 

. 그것은이하는 모든입니다

  • 새로운 메모리 블록에 새로운 메모리 블록을 기존 메모리 블록에서 malloc
  • 복사 데이터를 할당 memcpy
  • 무료 기존 메모리 블록 free
  • 반환 새로운 메모리 블록
+1

올바른 방법을 언급 할 수도 있습니다 ... –

+1

'std :: vector'는 복사/이동 연산자를 사용하는 반면, C 스타일 버전은 비 POD 유형에 대해 정의되지 않은 동작을 생성합니다. – spraff

+2

"힙에있는 모든 C++의 모든 것"섹션의 목적은 무엇입니까? – GManNickG

1

수 있습니다 확실하게 배열을 확장하지만, 내용을 복사하고 무료로 처리해야합니다 이전 배열 (잘못된 구문이 아 니라 코드에서 btw 배열을 줄입니다.).

정확히 std::vector의 작동 방식은 이므로 걱정할 필요가 없습니다..

{ 
    std::unique_ptr<int[]> d(a); 
    a = new int[desired_new_size]; 
    for(unsigned int i = 0; i < min_old_size_and_new_size; ++i) 
     a[i] = d[i]; 
} 

주 엄격 결코 정말 배열을 확장하지 "확장"말하기,하지만 (서로 더 큰으로 대체 : int *a가 이미 할당 가진 그러니까 기본적으로

는 어떤 일이 필요로하는 것은 같은 것이있다 동일한 기능을 제공하는 컨테이너의 경우에도 마찬가지입니다). 그러나 이것은 포인터를 나중에 사용하는 코드에 투명합니다. 아무도 알 수 없습니다.

당신이해야 결코 사용 realloc (또는 다른 C 메모리 할당 기능) 위의 지적 메모리 할당 또는 operator newdelete (또는 new[]delete[])에 의해 해제와 함께한다.
(보통 가능)으로 작동하지만 개념적으로 잘못되어 충돌이 발생하지 않는 경우 순수한 운 (알 수없는 구현 세부 사항)입니다.

관련 문제