• 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++学习笔记
     
     
     
     
  • 相关阅读:
    laravel获取不到session
    laravel表单提交419错误
    'cross-env' 不是内部或外部命令,也不是可运行的程序 或批处理文件。
    centos 虚拟机出问题 Oh no,something has gone wrong! 解决方法
    fastadmin关闭验证码登录
    php二维数组排序
    不自动显示html表单记住的内容 自动完成等清除记忆
    两个服务器之间使用minio同步文件
    redis获取数据库个数
    html跳转页面
  • 原文地址:https://www.cnblogs.com/Toya/p/9603053.html
Copyright © 2020-2023  润新知