new 和 delete

C++的内存申请和释放是通过 new 和 delete 实现的, 而new 和 delete 其实就是通过 malloc 和 free 实现的。

new 申请内存分为三个步骤:

  1. 调用 operator new 函数分配目标类型的内存大小,operator new 函数内部就是调用的 malloc 函数。
  2. 将申请得到的内存块强制转换为目标类型指针。
  3. 通过指针调用目标的构造函数(只有编译器可以这样直接调用构造函数)。

delete 释放内存分为两个步骤:

  1. 调用对象的析构函数。
  2. 调用 operator delete 函数释放对象内存,operator delete 函数内部就是调用的 free 函数。

array new 和 array delete

array new 是申请多个对象的内存。

Cookie

通过 malloc 分配的内存,会在内存前后加上 cookie,以记录内存分配的总大小,这里以包含三个 int 数据的 Demo 类为例:

上面 61h 存储的就是内存块的大小,其中最低位用于表示是否已分配(1表示已分配,0表示已回收),其中的 3 记录了分配对象的数量。

当申请内存后,返回的指针指向数据开始处(00481c34),而使用 delete[] 释放时,指针会指向00481c30,从而可以根据对象的数量调用相应次数的析构函数。如果使用 delete 释放的话,它不会去00481c30地址获取对象的长度,而是直接释放00481c34位置处的对象。

所以,new[] 和 delete[] 需要配合使用,但是如果对象的类型是内置类型或者是无自定义的析构函数的类类型,是可以使用 delete 来释放 new[] 对象的。否则使用 delete 来释放对象的话,对象所分配的内存空间可以释放,但是只会调用第一个对象的析构函数,可能导致内存泄漏。

对于 cookie,可以从运行速度和空间使用两个方面去进行改进:

  1. 减少 malloc 的调用次数(虽然 malloc 的速度很快)。
  2. 每一个 new 的对象都会有上下两个 cookie,可以预先申请一块内存池,然后供对象实例化,这样只会在这一整块的内存池上下有 cookie,同时也可以减少 malloc 的调用次数。

参考:

  1. C++内存管理(malloc和free中的cookie)
  2. C++内存分配之new与delete

  3. new和delete或new[]和delete[]为什么要配对使用?

  4. [c++]重新了解delete[]

C++内存管理:new / delete 和 cookie的更多相关文章

  1. C++内存管理-new,delete,new[],placement new的简单使用

    技术在于交流.沟通,本文为博主原创文章转载请注明出处并保持作品的完整性 首先,我们先看一下C++应用程序,使用memory的途径如下图所示 C++应用程序中申请内存基于分配器的实现(std::allo ...

  2. 内存管理——new delete expression

    C++申请释放内存的方法与详情表 调用情况 1.new expression new表达式在申请内存过程中都发生了什么? 编译器将new这个分解为下面的主要3步代码,①首先调用operator new ...

  3. Java复习2.程序内存管理

    前言: 国庆节的第三天,大家都回家了,一个人在宿舍好无聊.不过这年头与其说是出去玩不如是说出去挤,所以在学校里还是清闲的好.找工作不用担心了,到时候看着你们慢慢忙:插个话题,大学都没有恋爱过,总之各种 ...

  4. C/C++(C++内存管理,内联函数,类型转换,命名空间,string类)

    ---恢复内容开始--- 内存管理 new/delete C语言中提供了 malloc 和 free 两个系统函数,#include "stdlib.h"库函数,完成对堆内存的申请 ...

  5. 【UE4 C++】UObject 创建、销毁、内存管理

    UObject 的创建 NewObject 模板类 本例使用 UE 4.26,只剩下 NewObject 用来创建 UObject,提供两个带不同可选参数构造函数的模板类 Outer 表示这个对象的外 ...

  6. 动态内存管理详解:malloc/free/new/delete/brk/mmap

    c++ 内存获取和释放 new/delete,new[]/delete[] c 内存获取和释放 malloc/free, calloc/realloc 上述8个函数/操作符是c/c++语言里常用来做动 ...

  7. 动态内存管理:malloc/free/new/delete/brk/mmap

    这是我去腾讯面试的时候遇到的一个问题——malloc()是如何申请内存的? c++ 内存获取和释放 new/delete,new[]/delete[] c 内存获取和释放 malloc/free, c ...

  8. C++内存管理(new operator/operator new/operator delete/placement new)

    new operator 我们平时使用的new是new操作符(new operator),就像sizeof一样是语言内置的,不能改变它的含义,功能也是一样的 比如: string *ps = new ...

  9. 内存管理运算符new delete与内存管理函数malloc free的区别——已经他们对对象创建的过程。

    (1)内存管理函数与内存管理运算符的区别 内存管理函数有内存分配函数,malloc calloc realloc 以及内存释放函数free. 内存管理运算符有new 和delete. 两种内存管理方式 ...

随机推荐

  1. Typora图片自动上传至码云

    Typora图片自动上传至码云 下载PicGo图片上传工具 PicGo下载地址 下载完毕后打开PicGo,点击插件设置,搜索Gitee,点击安装gitee 2.0.3 码云仓库创建 创建参数是点击设置 ...

  2. 大白话讲解Mybatis的plugin(Interceptor)的使用

    mybatis提供了一个入口,可以让你在语句执行过程中的某一点进行拦截调用.官方称之为插件plugin,但是在使用的时候需要实现Interceptor接口,默认情况下,MyBatis 允许使用插件来拦 ...

  3. jenkins内置变量的使用

    参考链接:  https://www.cnblogs.com/puresoul/p/4828913.html 一.查看Jenkins有哪些环境变量 1.新建任意一个job 2.增加构建步骤:Execu ...

  4. Python 练习 人事管理

    人事管理系统介绍:1.展示页面:    ①首页:    ==========欢迎来到简历管理系统v2.1.1==========                1.管理员登录              ...

  5. 菜鸡的Java笔记 第二十四 - java 接口的基本定义

    1.接口的基本定义以及使用形式        2.与接口有关的设计模式的初步认识        3.接口与抽象类的区别                 接口与抽象类相比,接口的使用几率是最高的,所有的 ...

  6. [loj3525]喷泉公园

    先将整张图$x$和$y$​都缩小一半,即"道路"长度变为1,"长椅"变为放在格子中心 如果在没有长椅的限制下也无解(直接dfs即可判定),显然原问题也无解 否则 ...

  7. [atAGC006D]Median Pyramid Hard

    二分答案,考虑答案是否会大于等于这个mid,显然所有数值分为两类:大于等于mid和小于mid将n个数转化为01串,如果0和1不相邻,那么答案就是第一个数/最后一个数(一定会相同),考虑有连续两个0/1 ...

  8. generator函数与async/await

    理解async函数就要先理解generator函数,因为async就是Generator函数的语法糖 Generator 函数 Generator 函数是 ES6 提供的一种异步编程解决方案,可以先理 ...

  9. [SVN] Branch and Tag

    在 SVN 中,如何建立分支以及如何标记Tag. 右键要处理的文件夹,选择 "TortoiseSVN" - "Branch/tag...",进入下面界面: To ...

  10. 数值最优化:一阶和二阶优化算法(Pytorch实现)

    1 最优化概论 (1) 最优化的目标 最优化问题指的是找出实数函数的极大值或极小值,该函数称为目标函数.由于定位\(f(x)\)的极大值与找出\(-f(x)\)的极小值等价,在推导计算方式时仅考虑最小 ...