zoukankan      html  css  js  c++  java
  • new/delete

    来自:https://www.cnblogs.com/xuelisheng/p/9339957.html

    new:

    • 简单类型(包括基本数据类型和不需要构造函数的类型)直接调用operator new分配内存;
    • 复杂数据类型的时候先调用operator new,然后在分配的内存上调用构造函数。

    delete:

    • 简单数据类型(包括基本数据类型和不需要析构函数的类型)默认只是调用free函数。
    • 复杂数据类型(需要由析构函数销毁对象)先调用析构函数再调用operator delete。
    3、new 数组
    new[]也分为两种情况:
    (1) 简单数据类型(包括基本数据类型和不需要析构函数的类型)
      针对简单类型,new[]计算好大小后调用operator new。
    (2)复杂数据类型(需要由析构函数销毁对象)
      针对复杂类型,new[]会额外存储数组大小。
     
    4、delete 数组
    delete[]也分为两种情况:
    (1) 简单数据类型(包括基本数据类型和不需要析构函数的类型)
      针对简单类型,delete和delete[]等同。
    (2)复杂数据类型(需要由析构函数销毁对象)
      针对复杂类型,new[]出来的内存只能由delete[]释放。
     
    //转载:https://www.cnblogs.com/fudong071234/p/7244983.html
    Q:delete是如何知道要释放的内存的大小的

    内存分配一般有两种方式: 
    1 非入侵式,内存分配器自行先申请内存(和栈配合使用),用作记录用户层的申请记录(地址,大小)。 用户释放空间时会查找该表,除了知道释放空间大小外还能判断该指针是合法。

    2 入侵式,例如用户要申请1byte的内存,而内存分配器会分配5byte的空间(32位),前面4byte用于申请的大小。释放内存时会先向前偏移4个byte找到申请大小,再进行释放。
    两种方法各有优缺点,第一种安全,但慢。第二种快但对程序员的指针控制能力要求更高,稍有不慎越界了会对空间信息做成破坏。

    绝大多数的分配器会采用第一种方式实现,而操作系统级的分配器采用了虚拟等方式,可能要记录更多信息。

    Q:delete[]如何知道需要调用析构函数次数

    A:C++ 的做法是在分配数组空间时多分配了 4 个字节的大小,专门保存数组的大小,在 delete [] 时就可以取出这个保存的数,就知道了需要调用析构函数多少次了。

     返回 C++学习笔记
     
     
     
     
  • 相关阅读:
    POJ 1003 解题报告
    POJ 1004 解题报告
    POJ-1002 解题报告
    vi--文本编辑常用快捷键之光标移动
    常用图表工具
    September 05th 2017 Week 36th Tuesday
    September 04th 2017 Week 36th Monday
    September 03rd 2017 Week 36th Sunday
    September 02nd 2017 Week 35th Saturday
    September 01st 2017 Week 35th Friday
  • 原文地址:https://www.cnblogs.com/Toya/p/9603053.html
Copyright © 2011-2022 走看看