扩展动态分配的数组

时间:2010-10-20 17:14:46

标签: c++ arrays dynamic

我按如下方式分配了一个数组。

#include <iostream>

int main() {
    const int first_dim = 3;
    const int second_dim = 2;

    // Allocate array and populate with dummy data
    int** myArray = new int*[first_dim];
    for (int i = 0; i < first_dim; i++) {
        myArray[i] = new int[second_dim];
        for (int j = 0; j < second_dim; j++) {
            myArray[i][j] = i*second_dim + j;
            std::cout << "[i = " << i << ", j = " << j << "] Value: " << myArray[i][j] << "\n";
        }
    }

    // De-allocate array
    for (int i = 0; i < first_dim; i++)
        delete[] myArray[i];
    delete[] myArray;
}

假设我想在第一维中添加第4个元素,即myArray[3]。这可能吗?

我听说过Vector对于这个目的来说效率更高,但我几乎不知道它们是什么,我以前从未使用它们。

2 个答案:

答案 0 :(得分:5)

是的,但是非常痛苦。你需要做的是分配新的内存,它现在有你想要的新尺寸,在这种情况下是4和2,然后将矩阵的所有内容复制到你的新矩阵,然后释放前一个矩阵的内存...那是痛苦。现在让我们看看向量如何做同样的事情:

#include <vector>
using std::vector;

int main()
{
   vector< vector <int> > matrix;
   matrix.resize(3);
   for(int i = 0; i < 3; ++i)
      matrix[i].resize(2);

   matrix[0][1] = 4;
   //...

   //now you want to make the first dimension 4? Piece of cake

   matrix.resize(4);
   matrix[3].resize(2);
}

HTH

修改 的 对原始代码的一些评论:

  • 在C ++中,ALL_CAP_NAMES通常是指宏(你是#define)。避免在其他情况下使用它们
  • 为什么要声明FIRSTDIM和SECONDDIM是静态的?这绝对没必要。如果局部变量是静态的,则非正式地表示下次使用保持值调用函数时它将是相同的变量。因为你在技术上不能称为第二个sime,这是没用的。即使你能做到这一点,它仍然是无用的。
  • 你应该wrire delete [] array[i];delete [] array;所以编译器知道你试图删除的int *和int **实际上指向一个数组,而不仅仅是一个int或int *。

答案 1 :(得分:2)

  

假设我想在第一个维度添加第4个元素,即myArray [3]。这可能吗?

是的,但这是一个痛苦的脖子。它基本上归结为分配一个新数组,就像你现有的代码一样(提示:将它放在函数中并为该函数设置大小参数)并复制兼容的元素。

编辑std::vector为您做的一件事就是正确地取消内存分配。在您拥有的代码中,未能沿第二维分配其中一个数组将导致内存泄漏。更强大的解决方案会在执行任何分配之前将指针初始化为0。然后,异常块可以捕获异常并释放部分分配的任何内容。

由于此代码很快变得复杂,人们会求助于分配单个缓冲区并使用步幅或使用1D阵列的1D阵列(即std::vector std::vector s)进行寻址。