• ”()“和”[]“引发的血案——由此引出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数组空间

      

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

  • 相关阅读:
    第十六节 URL映射的时候指定默认参数
    第十五节 自定义path转换器
    第十四节 reverse函数补充
    第十一节 实例命名空间
    第十节 url命名和应用命名空间
    第八节 url解释器
    MySQL条件查询
    MySQL判断数据是否为空
    MySQL拼接字符串
    MySQL加号+ 的作用
  • 原文地址:https://www.cnblogs.com/xiehongfeng100/p/4031793.html
Copyright © 2020-2023  润新知