如何初始化一个与mallocing内存不同的数组?

时间:2012-12-31 06:36:30

标签: arrays memory-management c++

我是C ++的新手。我无法区分初始化数组和mallocing内存。对我而言,他们似乎也达到了同样的目的。

具体来说,我可以通过int myArray[] = {1, 2, 3};初始化一个数组。我也可以使用malloc获取内存并将其分配给void指针。后来,我释放了这段记忆。

这两种方法有什么区别?计算机是否以相同的方式存储数据?

2 个答案:

答案 0 :(得分:2)

在C ++中,有两种不同的方式可以分配内存。第一种方式在堆栈上分配内存。

int arr[] = {1,2,3};
int arr[3];

这两行代码在堆栈上创建一个大小为3的数组。唯一的区别是第一行也初始化数组中的值。

您可以在堆上分配内存的第二种方式。堆上可用的内存量通常远大于堆栈上可用的内存量。 newmalloc操作在堆上分配内存。

int* arr = (int*) malloc(100*sizeof(int));
int* arr = new int[100];

这两行代码在堆上创建一个大小为100的数组。现在这是两者之间的区别。在C ++中,您应始终使用new,因为它确保调用数组中每个元素的构造函数。它也更加类型安全,不像malloc,它根本不是类型安全的,因为它只返回一个void*到一个字节块,无论如何你都可以解释它。

现在,如果你动态分配内存,意味着在运行之前你不知道数组的大小,你应该总是使用new / malloc在堆上分配它。

最后要注意的是如何使用delete / free释放记忆。

free(arr); //arr was allocated with malloc
delete[] arr; //arr was allocated with new

如果您使用new分配了内存,则必须使用delete释放内存。您不能将new / mallocdelete / free混合搭配。最后delete[]释放一组对象。如果您只分配了一个对象,那么只需使用delete

Object* myobj = new Object;
delete myobj;

答案 1 :(得分:0)

在我看来,这个问题不属于这里。但我会回答。你可以用:

来做到这一点
 int* myArray = (int *) malloc(3 * sizeof(int));

这意味着您正在创建内存大小为3 * sizeof(int)的内存位置[即C]中整数数据类型的大小,并返回一个指向此内存位置的int指针。 [即一个指向它开头的指针,如果包含整数则处理它。这些内存槽转换为int *(using(int *)),并调用myArray。 myArray是一个int数组(和一个int指针)。因为数组实际上是C中的指针。然后你这样做:

 for (int i = 0; i < 3; i++) 
     myArray[i] = i + 1;

malloc可能存在一些问题。因此,在初始化之后总是检查myArray是否== NULL。如果是这种情况,请修复错误,并且不要使用$ \ {1,2,3 \} $初始化数组。否则,您将收到分段错误。

我希望我对你不模糊。但由于您使用的是C ++,我建议您使用new运算符。你会这样做:

 int myArray[] = new int[3];