2013-10-22 5 views
1

내 질문은 this 대답에서 발생합니다. 주석에서 그는 할당 된 동적 2D 배열을 역순으로 삭제해야한다고 언급했습니다. 그러나이 작업을 수행해야하는 이유를 많이 이해하지 못했습니다. 다음은 코드입니다.2D 배열을 올바르게 삭제 하시겠습니까?

//intialising array 
int size = 10000; 
double **array = new double[size]; 
for(int i = 0; i < size; i++) 
    array[i] = new double[size]; 

//conventional de-initialise 
for(int i = 0; i < size; i++) 
    delete[] array[i]; 
delete[] array; 

//reverse de-initialise 
for(int i = size - 1; size >= 0; i--)//notice reverse order here 
    delete[] array[i]; 
delete[] array; 

제 질문은 2D 배열을 할당 해제하는 2 가지 방법간에 중요한 차이점이 있습니까?

+1

C++ 규칙은 오브젝트가 생성 된 순서의 역순으로 오브젝트를 제거하는 것입니다. 그러나이 규칙은 객체가 서로 의존하는 경우를 제외하고는 동적으로 할당 된 객체와 거의 관련이 없습니다. – jxh

+0

아니요 (하지만 그 중 하나를 선택해서는 안됩니다). –

+1

@Jerry 나 한테해야한다고 말한 이유를 말해 줄 수 있니? –

답변

0

이 예에서는 아무런 차이가 없습니다. 100K 포인터를 만들고 각각에 대해 메모리를 할당합니다. 메모리를 할당/할당 해제하고 포인터 배열에 할당하는 방법은 중요하지 않습니다.

그러나 역방향 할당 취소가 다른 게시물에 있었던 이유와 반대되는 예에 대한 질문입니다. 카운터 변수는 새 메모리 할당이 실패한 경우 마지막 할당 된 개체에서 카운트 다운까지 다시 사용됩니다. 다른 방향의 할당을 해제하면 거기에 추가 변수가 필요합니다.

try 
{ 
    array = new double*[size]; 

    // Don't shadow counter here. 
    for(counter = 0; counter < size; counter++) 
    { 
     array[counter] = new double[size]; 
    } 
} 
catch(std::bad_alloc) 
{ 
    // delete in reverse order to mimic other containers. 
    for(--counter; counter >= 0;--counter) 
    { 
     delete[] array[counter]; 
    } 

    delete[] array; 
관련 문제