”()“和”[]“引发的血案——由此引出C++中关键词new
先来看一个程序吧:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <iostream> 2 #include <cassert> 3 4 using namespace std; 5 6 int main() 7 { 8 int len = 5; 9 int * p = new int(len); 10 assert(p != NULL); // 判断申请到内存是否成功 11 12 for (int i = 0; i < len; i++) 13 { 14 assert(i < len); // 防止越界,当然,在这时for语句已经限定循环的范围, 15 // 加上该句只是为了提醒自己随时要记得进行越界检查 16 p[i] = i; 17 cout << p[i] << endl; 18 } 19 20 delete[] p; 21 return 0; 22 }
这个程序崩掉了!!!百思不得其解,后来才发现自己对new的语法还是不熟悉。正确的应该是这样子(即在为指针变量p申请内存时用到的”()“改为”[]“):
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <iostream> 2 #include <cassert> 3 4 using namespace std; 5 6 int main() 7 { 8 int len = 5; 9 int * p = new int[len]; 10 assert(p != NULL); // 判断申请到内存是否成功 11 12 for (int i = 0; i < len; i++) 13 { 14 assert(i < len); // 防止越界,当然,在这时for语句已经限定循环的范围, 15 // 加上该句只是为了提醒自己随时要记得进行越界检查 16 p[i] = i; 17 cout << p[i] << endl; 18 } 19 20 delete[] p; 21 return 0; 22 }
在new的语法中,new int (5)和new int[5]表示的意思完全不同,见下:
int * p = new int(5); // 申请一个存放int类型数据的内存,将该内存的地址赋予p, // 并将该内存初始化为5. int * p = new int[5]; // 申请一块能够存放5个int类型数据的内存,将该块内存的 // 的地址赋予p,整块内存都没有初始化
下文只记录一下较简单的new和delete用法:
new用法:
1. 开辟单变量地址空间
1)new int; //开辟一个存放数组的存储空间,返回一个指向该存储空间的地址.int *a = new int 即为将一个int类型的地址赋值给整型指针a.
2)int *a = new int(5) 作用同上,但是同时将整数赋值为5
2. 开辟数组空间
一维: int *a = new int[100];开辟一个大小为100的整型数组空间
二维: int **a = new int[5][6]
三维及其以上:依此类推.
一般用法: new 类型 [初值]
delete用法:
1. int *a = new int;
delete a; //释放单个int的空间
2.int *a = new int[5];
delete [] a; //释放int数组空间
更深入研究及记录有待添加...