2008-10-13 5 views
22

표준 C++ 언어로 다차원 배열을 삭제하는 연산자가 있는지 궁금합니다. 위대한왜 "delete [] [] ... multiDimensionalArray;" C++의 연산자가 없습니다.

delete [] array; 

: 우리가 같은 단일 차원 배열에

int *array = new int[size]; 

삭제 외모에 대한 포인터를 만든 경우

. 우리는 두 가지 차원 배열이있는 경우, 우리는 그 대신에, 우리가해야 루프

delete [][] twoDimenstionalArray; 

을하고 this 예에서와 같이 항목을 삭제할 수 없습니다.

아무도 설명 할 수 있습니까?

답변

25

기술적으로 C++에는 2 차원 배열이 없습니다. 2 차원 배열로 사용하는 것은 각 요소가 1 차원 배열 인 1 차원 배열입니다. 기술적으로 존재하지 않으므로 C++은이를 삭제할 수 없습니다.

0

delete []은 비 스칼라 (배열)에 적용됩니다.

+0

아니요, 톱니 모양 배열을 삭제하려고하면 메모리 누수가 발생합니다. –

4

언어 디자인의 관점에서 정확한 이유가 확실하지 않지만, 메모리를 할당 할 때 배열 배열을 만들고 각각을 삭제해야한다는 사실과 관련이 있습니다.

int ** mArr = new int*[10]; 
for(int i=0;i<10;i++) 
{ 
    mArr[i]=new int[10]; 
} 

내 C++은 녹슬지 만 구문 상 올바른지 확실하지는 않습니다.

7

이 예제에서 delete가 여러 번 호출 된 이유는 new가 여러 번 호출 되었기 때문입니다. 삭제할 때마다 delete를 호출해야합니다.

예를 들어 1,000,000 바이트의 메모리를 할당 한 경우 나중에 항목을 200,000 - 300,00에서 삭제할 수 없으므로 하나의 전체 청크로 할당되어 하나의 전체 청크로 해제되어야합니다.

+2

따라서 반대도 마찬가지입니다. 여러 청크로 할당 된 경우 여러 청크로 해제해야합니다. –

+1

예, 정확하게 맞습니다! – KPexEA

20

int **array = new int[dim1][dim2]; 

모든 뉴스/삭제가 균형을 이루어야 호출 할 방법이 없다, 그래서 delete [][] 운영자에게 아무 소용이 없기 때문입니다.

new int[dim1][dim2]int[dim2] 유형 dim1 크기의 배열에 대한 포인터를 반환합니다. 따라서 dim2은 컴파일 시간 상수 여야합니다. 이는 다차원 배열을 스택에 할당하는 것과 비슷합니다.

+1

그 반대의 경우입니다. dim2는 컴파일 시간 상수 여야하며, dim1은 필요가 없으며 int (*) [dim2]가 반환됩니다. int를 수행하면 어떻게되는지 상상할 때 구문을 기억할 수 있습니다. v [dim1] [dim2 ]; 포인터가 쇠퇴 한 후에 v의 유형을 확인하십시오 : int (*) [dim2]; –

6

예를 들어 언급 한 것처럼 반복해야하는 이유는 삭제해야 할 배열 수가 컴파일러/할당 자에게 알려지지 않기 때문입니다.

2 차원 배열을 할당하면 실제로 N 개의 1 차원 배열이 만들어집니다. 이제는 그것들 각각을 지워야하지만, 시스템은 얼마나 많은지를 알지 못합니다. 최상위 배열의 크기, 즉 두 번째 수준 배열에 대한 포인터 배열은 C의 다른 배열과 같습니다. 크기는 시스템에 저장되지 않습니다.

따라서 언어를 크게 변경하지 않고도 설명대로 delete [][]을 구현할 방법이 없습니다.

0

래퍼 클래스를 사용하여 모든 것을 처리 할 수 ​​있습니다. "원시"데이터 형식으로 작업하는 것은 일반적으로 좋은 솔루션이 아닙니다. 배열은 클래스에 캡슐화되어야합니다. 예를 들어, std :: vector는 이것을하는 아주 좋은 예입니다.

삭제는 new가 호출 된 횟수와 정확히 일치해야합니다. "a = new X [a] [b]"를 호출 할 수 없기 때문에 "delete [] [] a"를 호출 할 수도 없습니다.

기술적으로 n 차원 매트릭스 전체가 이상하게 초기화되는 것을 방지하는 좋은 설계 결정입니다.

0

글쎄, 구현하기 쉽지만 너무 위험하다고 생각합니다. 포인터가 new[]으로 생성되었는지 여부는 쉽게 알 수 있지만 new[]...[] (허용되는 경우)에 대해서는 알기가 쉽지 않습니다.

3

모든 답변 관련이 있지만, 뭔가 같은 delete[][] array;가 동적으로 할당 된 배열에서 작동 할 수 있다는 기대에 와서 무엇을 설명하려고하고 그것이 불가능 이유 :

int array[ROWS][COLS];에서 허용 구문 정적으로 할당 된 배열은 실제로는 1 차원 배열 int array[ROWS*COLS];을 생성하는 프로그래머를위한 추상화 일뿐입니다. 그러나 컴파일 과정 (치수 크기가 COLSROWS이 표준에 의해 상수 여야 만하는 경우) 컴파일러는 나중에 예를 들어 구문을 사용하여 요소를 나중에 지정하는 데 필요한 치수의 크기를 기억합니다. array[x][y] = 45. 이 크기로 알려진 컴파일러는 [x][y]을 간단한 수학을 사용하는 1 차원 배열에 대응하는 인덱스로 대체합니다 : [COLS*x + y].

반면에 동일한 다차원 기능 (사실상 표기법)을 원한다면은 동적으로 배열을 할당 할 수 없습니다. 런타임 중에 크기가 결정될 수 있기 때문에 나중에 사용하기 위해 각 추가 치수의 크기를 기억해야하며 배열의 전체 수명 동안 기억해야합니다. 더욱이 배열을 실제로 다차원으로 작업하기 위해 코드에서 [x][y] 형식의 액세스 표기법을 사용하고 컴파일하는 동안 1 차원 표기법으로 바꾸지 않고 나중에 런타임에서 바꾸는 대신 시스템 변경을 구현해야합니다.

은 따라서는 부재 array = new int[ROWS][COLS]delete[][] array; 대한 필요성을 암시하지 않는다. 이미 언급했듯이 서브 어레이 (추가 차원)가 개별적으로 (new 호출을 사용하여) 할당되기 때문에 귀하의 "다차원"배열을 삭제하는 데 귀하의 예제에서 사용할 수 없으므로 맨 위에는 독립적입니다 배열 (array_2D)이 들어 있으며 한 번에 모두 삭제할 수 없습니다.

관련 문제