多维数组 - malloc vs new

时间:2015-07-20 08:12:24

标签: c++ c arduino malloc avr-gcc

我想分配2D数组,我正在考虑两种可能性(Arduio上的avr-gcc):

A:

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

B:

 int **arr = malloc(5 * sizeof(int *));
 for(int i = 0 ; i < 5 ; i++) {
    arr [i] = malloc(10* sizeof(int))
 } 

A和B之间有什么区别吗?编译器是否会在这两种情况下创建相同的字节代码(arv-gcc)?

3 个答案:

答案 0 :(得分:6)

在C中,你不能按new分配内存,因为没有这样的东西。对于C ++,您可能更喜欢new,原因如下:

  • 例外(除非您明确添加(std::nothrow)
  • 初始化列表(自C ++ 11起)
  • 更好的安全性,因为它返回正确类型的指针(特别是void *
  • 更清晰的语法(但这是纯粹主观的)

有关此问题的更多讨论,请参阅In what cases do I use malloc vs new?

如果你想分配二维数组并且在编译时至少知道最大尺寸(即它可以是一个常量表达式),你就不要循环。

C ++中的新功能

int (*arr)[10] = new int [2][10];

如果您希望使用零预设(即std::calloc),请使用:

int (*arr)[10] = new int [2][10]{0}; // C++11
int (*arr)[10] = new int [2][10]();  // C++03

就像new[]分配的任何数组一样,有一个相应的delete[]运算符可以释放它:

delete[] arr;

C ++和C ++中的Malloc

int (*arr)[10] = malloc(5 * sizeof(*arr));

这会分配数组,就像arr[5][10]一样(仅在索引意义上)。

要在两者中访问其元素,只需使用:

arr[a][b]

要释放它,你基本上可以:

free(arr);

在C ++中,您还需要处理强制转换,并可能使用std对其进行限定,因此它std::malloc(特别是如果包含cstdlib,则为stdlib.h } C ++标准中不推荐使用header:

const int N = 10;

int (*arr)[N] =
    static_cast<int (*)[N]>(std::malloc(5 * sizeof(*arr)));

但我不认为你会喜欢它。

答案 1 :(得分:4)

如果你正在使用C ++编译器(而Arduino草图 C ++),你可能更喜欢new。做一个简单的int数组不太重要,但我只留下C遗留的东西只用于 在C环境中运行的代码。

现在,对于C +程序员(那些从未全心全意从C转换到C ++的好奇程序员)来说,现在绝对没有理由存在: - )

答案 2 :(得分:2)

A和B基本相同。

编译器可能会也可能不会创建相同的代码(不是字节代码BTW)。但通常使用new运算符只需调用malloc。要查找,请使用gcc -S编译您的程序,并查看程序集输出。

但是对于c ++程序,您应该更喜欢newmalloc