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

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

delete 释放内存分为两个步骤:
- 调用对象的析构函数。
- 调用 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,可以从运行速度和空间使用两个方面去进行改进:
- 减少 malloc 的调用次数(虽然 malloc 的速度很快)。
- 每一个 new 的对象都会有上下两个 cookie,可以预先申请一块内存池,然后供对象实例化,这样只会在这一整块的内存池上下有 cookie,同时也可以减少 malloc 的调用次数。
参考:
C++内存管理:new / delete 和 cookie的更多相关文章
- C++内存管理-new,delete,new[],placement new的简单使用
技术在于交流.沟通,本文为博主原创文章转载请注明出处并保持作品的完整性 首先,我们先看一下C++应用程序,使用memory的途径如下图所示 C++应用程序中申请内存基于分配器的实现(std::allo ...
- 内存管理——new delete expression
C++申请释放内存的方法与详情表 调用情况 1.new expression new表达式在申请内存过程中都发生了什么? 编译器将new这个分解为下面的主要3步代码,①首先调用operator new ...
- Java复习2.程序内存管理
前言: 国庆节的第三天,大家都回家了,一个人在宿舍好无聊.不过这年头与其说是出去玩不如是说出去挤,所以在学校里还是清闲的好.找工作不用担心了,到时候看着你们慢慢忙:插个话题,大学都没有恋爱过,总之各种 ...
- C/C++(C++内存管理,内联函数,类型转换,命名空间,string类)
---恢复内容开始--- 内存管理 new/delete C语言中提供了 malloc 和 free 两个系统函数,#include "stdlib.h"库函数,完成对堆内存的申请 ...
- 【UE4 C++】UObject 创建、销毁、内存管理
UObject 的创建 NewObject 模板类 本例使用 UE 4.26,只剩下 NewObject 用来创建 UObject,提供两个带不同可选参数构造函数的模板类 Outer 表示这个对象的外 ...
- 动态内存管理详解:malloc/free/new/delete/brk/mmap
c++ 内存获取和释放 new/delete,new[]/delete[] c 内存获取和释放 malloc/free, calloc/realloc 上述8个函数/操作符是c/c++语言里常用来做动 ...
- 动态内存管理:malloc/free/new/delete/brk/mmap
这是我去腾讯面试的时候遇到的一个问题——malloc()是如何申请内存的? c++ 内存获取和释放 new/delete,new[]/delete[] c 内存获取和释放 malloc/free, c ...
- C++内存管理(new operator/operator new/operator delete/placement new)
new operator 我们平时使用的new是new操作符(new operator),就像sizeof一样是语言内置的,不能改变它的含义,功能也是一样的 比如: string *ps = new ...
- 内存管理运算符new delete与内存管理函数malloc free的区别——已经他们对对象创建的过程。
(1)内存管理函数与内存管理运算符的区别 内存管理函数有内存分配函数,malloc calloc realloc 以及内存释放函数free. 内存管理运算符有new 和delete. 两种内存管理方式 ...
随机推荐
- 体验用yarp连接websocket
前段时间一看yarp的仓库,wow,终于发布1.0版本了..net也升级到6版本了,之前一直只是用yarp做HTTP转发,今天刚好试试websocket 话不多说,直接开搞 配置集群 首先先配置集群信 ...
- ndarray 数组的创建和变换
ndarray数组的创建方法 1.从python中的列表,元组等类型创建ndarray数组 x = np.array(list/tuple) x = np.array(list/tuple,dtype ...
- Python布尔值
在学到Python数据类型时,发现与大多数语言没什么区别 布尔值可以用 and or not 来运算 and运算是与运算,所有条件都符合才为true >>> True and Tru ...
- 分布式配置系统Apollo如何实时更新配置的?
引言 记得我们那时候刚开始学习Java的时候都只是一个单体项目,项目里面的配置基本都是写在项目里面的properties文件中,比如数据库配置啥的,各种逻辑开关,一旦这些配置修改了,还需要重启项目这修 ...
- 八、hive3.1.2 安装及其配置(本地模式和远程模式)
目录 前文 hive3.1.2 安装及其配置(本地模式和远程模式) 1.下载hive包 2.修改其环境变量 3.MySQL配置 Centos7 MySQL安装步骤: 1.设置MySQL源 2.安装My ...
- IDEA修改XML注释风格
作为一个强迫症患者,每次想在xml文件用快捷键注释的时候,它自动生成的注释一直都是这样的:这令我非常难受,于是每次我都要把光标移到前面,然后再Tab以下,让它变成这样可是每次都这样,好麻烦啊,如果自己 ...
- c语言是如何处理函数调用的?
1. 要编译的测试代码: int plus(int x, int y) { return x + y; } int main(void) { return plus(3, 4); } 2. main ...
- GraalVM最佳实践,使用Java开发CLI、Desktop(JavaFX)、Web(SpringBoot)项目,并使用native-image技术把Java代码静态编译为独立可执行文件(本机映像)
原创文章,转载请注明出处! 源码地址: Gitee Gtihub 介绍 GraalVM最佳实践,使用Java开发CLI.Desktop(JavaFX).Web(SpringBoot)项目,并使用nat ...
- Git的基础入门
Git --everything-is-local 查阅文档 Git是一个免费的开源 分布式版本控制系统,旨在快速高效地处理从小型到大型项目的所有内容. Git易于学习, 占地面积小,具有闪电般的快速 ...
- 自助分析工具Power BI的简介和应用
作为一名资深的IT技术人,特别喜欢学习和尝试新技术,也勇于接受挑战,勇于创新,不仅能发现问题,更要解决实际的疑难杂症,闲暇时光也乐于分享一些技术干货.记得2017年的时候,华章出版社的编辑通过网上找到 ...