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;
  }
}

案例2:

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;
  }
}

我能够使用两种方式插入和打印值。初始化有什么区别?

4

3 回答 3

2

有什么区别?

#1只是分配足够的内存来保存一个整数指针,而不是一个整数指针数组。
#2仅通过覆盖上一次迭代的内存分配导致内存泄漏。

我可以使用这两种方式插入和打印值

内存泄漏和未定义行为可能不会在您的程序中立即产生可观察到的错误结果,但它们肯定是墨菲定律的好例子。

正确的方法是:

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];
于 2012-09-14T11:21:46.540 回答
1

在这两种情况下都有内存泄漏。

初始化这种“二维”数组的正确方法是

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

但是请注意,它不是 C/C++ 定义的二维数组。它可能不会,也可能不会,在内存中是连续的。此外,访问成员的汇编代码也不同。

在您的情况下,通过索引访问相当于*(*(arr+i)+j)

在二维数组的情况下,它*(arr + N_COLS*i + j)N_COLS编译时间常数。

如果你想要一个真正的二维数组,你应该这样做:

int (*arr)[N_COLS] = (int(*)[N_COLS])(new int[N_ROWS * N_COLS])
于 2012-09-14T11:23:17.127 回答
0

你最好使用一维数组来管理二维数组

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;
于 2012-09-14T12:16:29.523 回答