初始化数组与错置内存有何不同?
How is initializing an array different from mallocing memory?
我是c++新手。我有困难区分初始化数组和错置内存。在我看来,它们似乎达到了同样的目的。
具体来说,我可以通过int myArray[] = {1, 2, 3};
初始化一个数组。我也可以使用malloc
来获取内存并将其分配给一个void指针。之后,我释放这个内存。
这两种方法的区别是什么?计算机是否以相同的方式将数据存储在相同的位置?
在c++中有两种不同的分配内存的方式。第一种方法是在堆栈上分配内存。
int arr[] = {1,2,3};
int arr[3];
这两行代码都在堆栈上创建了一个大小为3的数组。唯一的区别是第一行也初始化了数组中的值。
第二种分配内存的方法是在堆上。堆上可用的内存量通常比堆栈上可用的内存量大得多。new
和malloc
操作在堆上分配内存。
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
/malloc
与delete
/free
。最后,delete[]
释放一个对象数组。如果您只分配了一个对象,那么您只需使用delete
。
Object* myobj = new Object;
delete myobj;
我认为这个问题不属于这里。但我会回答的。你可以这样做:
int* myArray = (int *) malloc(3 * sizeof(int));
这意味着你正在创建内存大小为3 * sizeof(int)的内存位置[即C中整数数据类型的大小],并且你返回一个指向该内存位置的int指针。[即一个指针,指向它的开始,并处理它,如果它包含整数]。这些内存槽被转换为int *(使用(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];
- 将字符串存储在c++中的稳定内存中
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- Win32编译器选项和内存分配
- 当vector是tje全局变量时,c++中vector的内存管理
- 带内存和隔离功能的SQLite
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 迭代时从向量和内存中删除对象
- 在C++中打印指向不同基元数据类型的指针的内存地址
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 为什么示例代码访问IUnknown中已删除的内存
- 如何在C++类内存结构中创建"spacer"?
- 从构造函数抛出异常时如何克服内存泄漏
- malloc() 可能出现内存泄漏
- 如何理解将半精度指针转换为无符号长指针和相关的内存对齐
- 在调用FreeLibrary后,释放动态链接到具有相同版本的CRT堆的DLL的内存
- 如何针对特定情况调试和修复此双自由内存损坏问题
- 在C++中,我如何接受不同于同一行的用户输入
- 类型总是使用其大小存储在内存中吗
- 有没有一种方法可以测量c++程序的运行时内存使用情况