2012-09-14 4 views
0

사례 1 :두 차원 배열 초기화

int nrows=5; 
int ncols=10; 
int **rowptr; 
rowptr=new int*; 
for(int rows=0;rows<nrows;rows++) { 
    for(int cols=0;cols<ncols;cols++) { 
    *rowptr=new int; 
    } 
} 

CASE2 :

int nrows=5; 
int ncols=10; 
int **rowptr; 
for(int rows=0;rows<nrows;rows++) { 
    rowptr=new int*; 
    for(int cols=0;cols<ncols;cols++) { 
    *rowptr=new int; 
    } 
} 

나는 삽입 및 인쇄 값이 두 가지를 사용 할 수 있어요. 초기화의 차이점은 무엇입니까?

+0

왜 하나의 대답은 언급하지 않습니다 'N * M' 차원의 1D'std :: vector'? 바보 같은 메모리 누수가 없습니다. 배열을 나타내는 포인터에 대한 포인터가 없습니다. – rubenvb

답변

2

차이점은 무엇입니까?

#1은 정수 포인터의 배열이 아닌 정수 포인터를 저장할만큼 메모리를 할당합니다.
#2 이전 반복의 메모리 할당을 덮어 쓰면 메모리 누수가 발생합니다.

나는 삽입 할 수 있어요 및 인쇄 값은 프로그램에서 즉시 observale 잘못된 결과를 생성 할 수 없습니다 두 가지

메모리 누수 및 정의되지 않은 행동을 사용하지만 그들은 확실히 의 좋은 사례입니다 Murphy's Law.

이 작업을 수행하는 올바른 방법은 다음과 같습니다 당신은 두 경우 모두에서 메모리 누수가

int nrows = 5; 
int ncols = 10; 

//Allocate enough memory for an array of integer pointers 
int **rowptr = new int*[nrows]; 

//loop through the array and create the second dimension 
for (int i = 0;i < nrows;i++) 
    rowptr[i] = new int[ncols]; 
1

.

이러한 "2D"어레이를 초기화하는 적절한 방법은 C++/C에 의해 정의 된 2 차원 배열이 아닌, 그러나

int** arr = new int*[nrows]; 
for (int i = 0; i < nrows; i++) 
    arr[i] = new int[ncols]; 

주이다. 아마도 기억 속에 연속적이지 않을 수도 있고 그렇지 않을 수도 있습니다. 또한 멤버에 액세스하기위한 어셈블리 코드가 다릅니다. 귀하의 경우에는

는 색인에 의한 액세스는 N_COLS은 컴파일 시간 상수 때 *(arr + N_COLS*i + j)*(*(arr+i)+j)

에 그리고 2 차원 배열의 경우와 동일합니다.

당신이 진정한 2 차원 배열이 같은해야합니다 :

int (*arr)[N_COLS] = (int(*)[N_COLS])(new int[N_ROWS * N_COLS]) 
당신은 더 나은 관리하는 1D 배열을 사용하십시오
+0

어떻게 메모리 누수가 있지만? – user1583707

+0

이전 내용을 삭제하지 않고'rowptr'을 재 할당하고 있습니다. – StoryTeller

0

2 차원 배열을

int **x = new int*[nrows]; 
x[0] = new int[nrows*ncols]; 
for (int i = 1; i < nrows; i++) 
    x[i] = x[i-1] + ncols; 

for (int i = 0; i < nrows; i++) 
    for (int j = 0; j < ncols; j++) 
     x[i][j] = 0; 

delete [] x[0]; 
delete [] x;