”()“和”[]“引发的血案——由此引出C++中关键词new

  先来看一个程序吧:

 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 }
View Code

  这个程序崩掉了!!!百思不得其解,后来才发现自己对new的语法还是不熟悉。正确的应该是这样子(即在为指针变量p申请内存时用到的”()“改为”[]“):

 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 }
View Code

  在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数组空间

  

   更深入研究及记录有待添加...

原文地址:https://www.cnblogs.com/xiehongfeng100/p/4031793.html