• new/delete表达式


    new/delete的简单使用

    #include <iostream>
    
    using std::cout;
    using std::endl;
    
    //在C中用来开辟和回收空间的方式是采用malloc/free库函数
    //在C++中提供了新的开辟和回收空间的方式,采用new/delete表达式 
    int main()
    {
      //开辟一个元素空间
      int *p = new int(1); 
      cout << "*p = " << *p << endl;
      delete p;
    
      //开辟一个数组空间,注意使用 []
      int *q = new int[10]();
      for(int i = 0; i < 10; ++i)
      {
        q[i] = i;
      }
      for(int i = 0; i < 10; ++i)
      {
        cout << "q[" << i <<"] = " << q[i] << endl;
      }
      // 释放数组空间的时候,注意 []
      delete []q;
    
      return 0;
    }
    

    new/delete表达式与malloc/free的区别

      - malloc/free是C/C++的库函数,new/delete是C++的表达式
      - new能够自动分配空间大小,malloc需要传入参数
      - new开辟空间的同时还对空间做了初始化的操作,而malloc不行  
      - new/delete能对对象进行构造和析构函数的调用,进而对内存进行更加详细的工作,而malloc/free不能
    
      malloc/free,new/delete都是成对出现的,且必须成对出现,否则可能出现内存泄露
    
    new/delete的功能完全覆盖了malloc/free,为什么C++还保留malloc/free?
      C++程序要经常调用C函数,而C程序只能用malloc/free管理动态内存
    

    new表达式工作步骤

      - 调用名为operator new的标准库函数,分配足够大的原始的未类型化的内存,以保存指定类型的一个对象
      - 运行该类型的一个构造函数初始化对象
      - 返回指向新分配并构造的构造函数对象的指针
    

    delete表达式工作步骤

      - 调用析构函数,回收对象中数据成员所申请的资源
      - 调用名为operator delete的标准库函数释放该对象所用的内存
    
  • 相关阅读:
    struct{} //长篇更新
    channel //长篇更新
    切片 //长篇更新
    引用
    核心:数据篇
    ARM指令解析
    arm寄存器解析
    Java-Selenium,获取下拉框中的每个选项的值,并随机选择某个选项
    log4j:WARN No appenders could be found for logger (org.springframework.web.context.ContextLoader).
    eclipse安装springsource-tool-suite遇到的问题及解决方案
  • 原文地址:https://www.cnblogs.com/xkyrl/p/14661853.html
Copyright © 2020-2023  润新知