在C ++中动态分配指向数组的指针

时间:2014-05-23 19:10:27

标签: c++ arrays pointers malloc

我长期以来在C程序中使用指向数组的指针:

int (*myarray)[2] = (int (*)[2]) malloc(n*sizeof(int[2]));

但是,如何使用new在C ++中执行此操作?我可以这样做吗?

int (*myarray)[2] = (int (*)[2]) new int[n][2];

编辑:

看起来我原来的帖子不完整且令人困惑。这是一个我编译和测试的代码片段似乎做了正确的事情,但我想从C ++专家那里确认我使用的是适当的C ++构造。

#include <iostream>

int main() {

  int n=5;
  int (*A)[2] = new int[n][2];

  for (int i = 0; i < n; i++)
    for (int j = 0; j < 2; j++)
      A[i][j] = 2*i+j;

  for (int i = 0; i < n; i++)
    std::cout << A[i][0] << " " << A[i][1] << "\n";

  delete myarray;

}

2 个答案:

答案 0 :(得分:3)

使用C ++和STL的乐趣是你得到一个提供类似行为的数组的向量类。 这也使管理和阅读更容易......

std::vector< std::vector<int> > myarray(n);

如果您不想使用STL,那么总会有......

typedef int intarray[2];
intarray* ints = new intarray[n];
ints[0][0] = 1;
...
ints[n-1][1] = 6;

如果代码更容易阅读,我个人会写一些额外的代码。

答案 1 :(得分:2)

我认为做你要求的最明智的方法是对数组使用typedef:

typedef int array_t[2];
array_t* yourarray = new array_t[n];

不要这样做,因为它需要进行手动内存管理,并且往往是单调乏味,容易出错和易碎,特别是在异常安全方面。相反,请查看std::array类模板(C ++ 11中的新模板,但可通过Boost获得)和std::vector类模板。

为了阐明在容器中存储std::vectorstd::array之间的区别,后者通常在涉及的元素数量较少且数量固定时更有效。原因是数组类不像向量那样动态分配事物。为此,向量需要三个指针(开始,已用存储的结束和已分配存储的结束)以及数据本身的存储(加上可能由分配器引起的一些开销),所有这些都需要加载到CPU缓存中用来。考虑到LP64系统,需要32个字节来存储8个字节的数据,而使用std::array只需要8个字节。