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++学习笔记
     
     
     
     
  • 相关阅读:
    WebGL编程指南案例解析之绘制一个点
    在pixi中使用你的自定义着色器
    一个关于运维人员做事的很好的case,拿出来和大家共勉
    2015小目标
    在工作中修行
    ROW模式的SQL无法正常同步的问题总结
    从周末教儿子学溜冰联想到带人
    group_concat函数导致的主从同步异常
    招聘运维工程师
    一个锁的奇怪问题分析总结
  • 原文地址:https://www.cnblogs.com/Toya/p/9603053.html
Copyright © 2011-2022 走看看