- 普通数组在栈上分配内存,栈很小;如果需要存放更多的元素,必须在堆上分配内存。动态数组的意义就是如果要处理大量的数据,必须在堆上分配内存。
- 动态创建一维数组的语法:数据类型* 指针=new 数据类型[数据长度]。int* arr = new int[8];
-
释放一位数组的语法:delete[] 指针。delete arr;
// PointerTest12.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <string> #include <iostream> using namespace std; int _tmain(int argc, _TCHAR* argv[]) { int* arr = new int[8]; for (int i = 0; i < 8; i++) { arr[i] = 100 + i; //数组表示法 cout << "arr[" << i << "]=" << *(arr + i) << endl; //指针表示法 } delete[] arr; system("pause"); return 0; }
-
注意:
(1)普通数组有数组名,可以用sizeof运算符运算得得整个数组占用内存空间的大小,但是动态创建的数组没有数组名,只有一个指针,不能用sizeof运算符
(2)可以用数组表示法和指针表示法两种方式使用动态创建的数组。
(3)必须使用delete[]来释放动态数组的内存,不能只用delete,如果只用delete,释放的就只是第0个元素的内存空间,而不是整个数组。
(4)不一样delete[]来释放不是new[]分配的内存(C语言的malloc函数也可以动态分配内存,malloc分配的内存要用free()函数来释放,不能用delete)
还有,如果指针指向的地址是栈上的变量,也就是普通变量的地址,也不能用delete来释放,否则会引发异常。
(5)不要用delete[]释放同一块内存两次,否则等同于操作野指针。(delete释放内存之后,不会把指针置空,释放一次就行了,第二次就是在操作野指针)
(6)空指针用delete[]是安全的,所以释放内存后,应该把指针置空nullptr,这样可以防止误操作。
(7)声明普通数组的时候,数组长度可以用变量,相当于在栈上动态创建数组,并且不需要释放。(在实际开发中,如果数组很小,使用栈内存也是可以的,很安全很方便)
(8)如果内存不足,调用new会产生异常,导致程序中止;如果在new关键字后面加(std::nothrow)选项,则返回nullptr,不会产生异常。//在栈上分配内存 /* int a[1000001];//当在栈上申请较大的数组时,会导致栈溢出,此行代码会导致栈溢出 a[1000000] = 8; */ //在堆上分配内存,动态创建一维数组 //老师的教程里此处是想模拟内存不够时的情景,但是我这里总是在提示“数组的总大小不得超过 0x7fffffff 字节”,所以我没有模拟到内存不够的情况,但是思路是跟着老师来的 int *Arr = new(std::nothrow) int[100000001];//内存不够时会导致程序崩溃,为了防止程序崩溃,在new关键字后面加(std::nothrow),如果内存不够,则返回nullptr,然后再做判断 if (Arr = nullptr) { cout << "分配内存不足" << endl; } else { Arr[100000000] = 10; }
(9)为什么用delete[]释放数组的时候,不需要指定数组的大小?因为系统会自动跟踪已分配数组的内存
版权声明:本文为weixin_43443648原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。