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

      

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

  • 相关阅读:
    小小不爽一下
    银行家算法的讨论
    【转】C字符串处理函数的实现
    Oracle物理存储结构文件
    RAC和ASM环境下修改控制文件control file
    TNS01190: The user is not authorized to execute the requested listener comm (oracle”用户没有启动lisener的权限?)
    RAC环境ASM存储新增控制文件的方法
    Oracle RAC 修改 spfile 文件位置
    Rman通过duplicate创建standby
    rman恢复手册
  • 原文地址:https://www.cnblogs.com/xiehongfeng100/p/4031793.html
Copyright © 2011-2022 走看看