new和 delete 细细碎记录

c++中关于new和delete的内容都在这里了 new expression new一个类型,会创建一个该类型的内存,然后调用构造函数,最后返回该内存的指针 注意:该操作是原子性的。 在vc6中的实现如下 void *operator new(size_t size, const std::nothrow_t &) _THR. 阅读详情

1.new和 delete 细细碎记录

new是在C++中进行动态内存分配的函数,其底部的实现还是调用了C函数库的malloc。在调用new的时候,编译器主要做了三件事:

  1. 调用operator new 函数(底部还是调用malloc函数),得到一块指向void* 类型的指针。
  2. 使用static_cast函数进行类型的转换。
  3. 调用转换类型的构造函数。

与之相对的,在使用delete函数的时候,主要做了两件事:

  1. 析构函数。
  2. operator delete函数(底层使用free函数)释放内存空间。

2. 使用new分配出的空间在内存中是什么样子的?

如图所示,假设我们需要对类Complex申请动态内存,在调试模式下和在非调试模式的如左1,左2所示,其中:

  1. 红色部分:cookie部分,首尾都有。00000041 表示整块内存的整块内存的大小(16进制表示)。其实分配的内存只有40=4*16=64字节,而多出来的1表示该内存已经分配出去了。
  2. 灰色部分,调试信息,上面32字节,下面4个字节。(只有调试模式下有,如左2就没有)。
  3. 绿色部分:对象真正使用的内存。在Complex的对象中,由于存储了实部虚部两个double类型的数据,所以使用了8个字节。
  4. padding部分:分配的内存由于需要内存对齐为16的倍数,因此是对齐用的。

左3和左4为String对象申请分配的内存,String对象在设计时往往带有一根char* 的指针指向自己的字符串,因此分配一个String对象只需要4个字节。后面分析同上。

在这里插入图片描述

3. 使用new[]分配出的数组空间在内存中是什么样子的?

与分配单个对象相比,在VC下多了四个字节来存储内存中有几个对象(白色块)。由于这块内存记录了里面究竟有多少个对象的空间,delete[] 时如果调用了delete其实不会造成这块内存的泄露。而因为delete和delete[]相比,只会调用一次析构函数,因此,如果内存里面的对象有根指针指向内存,但没调用析构函数,则会造成内存里面对象指向的内容内存泄漏了。

总结:delete 和 delete[]相比,只调用一次析构函数,会造成对象里面指针(如果有)所指的内存内存泄漏,而不是new[]出来的内存内存泄漏了,因为new[]出来的内存是直到自己究竟多大的。

在这里插入图片描述

详解c++:new和delete 在C++中,new 和 delete 是两个非常重要的操作符,它们用于在堆(heap)上动态地分配和释放内存。这是与在栈(stack)上自动分配内存(例如,通过局部变量)或全局/静态分配内存(例如,全局变量或静态变量)的主要区别。使用堆内存可以让你在程序运行时根据需要动态地分配任意大小的内存块,并在不再需要时显式地释放这些内存块。下面我将全面且深刻的讲解new和delete且与malloc和free比较提示:以下是本篇文章正文内容,下面案例可供参考。 阅读详情

相关推荐

android jni new/delete 和 new[]/delete[]

今天,简单讲讲android里再jni使用new时如何释放内存。 这个其实是和C++有关的知识,不过jni编程时还是需要注意的。所以这里记录一下。 new 和 delete 到底是什么? 如果找工作的同学看一些面试的书,我相信都会遇到这样的题:sizeof 不是函数,然后举出一堆的理由来证明 sizeof 不是函数。在这里,和 sizeof 类似,new 和 delete

谢岩的博客 1809

C++ new 和 delete 的讲解

概述 运算符 new 和 delete 看起来很简单,但是它们也有不少的知识点。对于new来说就有 new operator、operator new、placement new 和 new operator[]等。对于 delete 也有 delete operator、poerator delete、delete operator[] 等。下面就进行按个整理。 1、new operator 平...

weixin_39640298的博客 5065

深度学习模型设计的方法和技巧

设计神经网络模型是一个迭代的过程,需要不断试验和调整各个组成部分,以达到最佳性能。同时,遵循良好的工程实践,如模块化设计、版本控制、文档记录等,也是成功的关键。

xw555666的博客 4027

C++使用new和delete的示例

下面介绍一个使用new和delete来存储通过键盘输入的字符串的示例。程序定义了一个函数getname( ),该函数返回一个指向输入字符串的指针。该函数将输入读入到一个大型的临时数组中,然后使用new [ ]创建一个刚好能够存储该输入字符串的内存块,并返回一个指向该内存块的指针。对于读取大量字符串的程序,这种方法可以节省大量内存(实际编写程序时,使用string类将更容易,因为这样可以使用内置的new和delete)。 假设程序要读取1000个字符串,其中最大的字符串包含79个字符,...

专注嵌入式开发与 Linux 系统应用实战,分享芯片驱动、设备调试、系统工具开发干货。 626

通俗理解Xgboost

为了简化计算,XGBoost采用了一阶导数(梯度)和二阶导数(Hessian)来近似损失函数的变化,从而推导出叶子节点值的更新公式。其中 z 就是所有树的叶子节点分数之和。通过这两个正则化项,XGBoost能够在优化目标函数时,不仅考虑损失函数的最小化,还考虑了模型的复杂度,从而达到更好的泛化性能。正则化项通常包括两个部分:一个是与叶子节点数量相关的项,另一个是与叶子节点输出值大小相关的项。通过这种方式,XGBoost能够有效地计算出每个叶子节点的值,同时通过正则化项来平衡模型的复杂度和泛化能力。

金融风控笔记 750

用户存续期价值评估CLV(二) BG/NBD Model python模拟

BG/NBD Model …继续 想象每一个客户有两个硬币,一个“Buy Coin"控制客户购买的概率;一个"Die Coin"控制客户流失、不再购买的概率。 前面假设了客户的交易次数服从泊松过程: 在一年中的每个月,客户都以抛硬币的方式来决定是否购买。我们所观察到的购买次数取决与泊松分布的参数 ????。 %matplotlib inline import numpy as np impor...

weixin_43171270的博客 3426

new/delete 详解

new 和 delete 是 C++ 用于管理 <font color=ff00ff>堆内存</font> 的两个运算符,对应于C语言中的 malloc 和 free,但是malloc和free是函数,new 和 delete 是运算符。

一只程序猿 2万+

MATLAB信号处理实战:VMD分解参数调优全指南(附避坑技巧)

本文深入探讨了MATLAB中变分模态分解(VMD)的核心参数调优实战技巧。针对模态数K和惩罚系数α的选择难题,提供了从经验估计、可视化观察到量化指标辅助的渐进式调优框架,并分享了避免过分解与欠分解的实用避坑指南,旨在帮助工程师高效处理非平稳信号,提取清晰的物理特征。

weixin_29079671的博客 144

C++:new 和 delete

本篇博客作为C++:new 和 detele操作符的知识总结class Apublic::_a(a)~A()private:int _a;return 0;注意:在申请自定义类型的空间时,new会调用构造函数,delete会调用析构函数new的原理1.调用operator new函数申请空间2.在申请的空间上执行构造函数,完成对象的构造delete的原理1.在空间上执行析构函数,完成对象中资源的清理工作。

li209779的博客 1457

Frenet坐标系下动态街道场景的最优轨迹生成

本文详细解读了Lattice Planner

BigDavid123的博客 2391

​​EMC设计实战:BCI(大电流注入)硬件设计规范

LIN接口:集成TVS管(如PESD5V0S1BL)与共模电感,耐压等级≥20V(8kV HBM)。输入滤波:10μF电解电容(100kHz截止)+ 0.1μF陶瓷电容(10MHz截止)。​:全频段(1MHz-400MHz)注入200mA电流,LIN通信误码率<0.01%。对敏感电路(如传感器)采用隔离电源(如ADuM5000),隔离电压≥3kVrms。​:连续波(CW)与调幅波(AM,调制深度80%)组合,覆盖全频段干扰场景。​:选择低频段(1-100MHz)感量≥100μH的绕线电感,抑制共模电流。

m0_50833886的博客 1933

new 和 delete 为什么要匹配使用

关于 new 和 delete 的使用相信大家并不陌生,可是为什么使用 new 的时候要用 delete,使用 new[ ] 的时候又要用 delete[ ]。使用 delete 释放 new[ ] 申请的内存又会发生什么?为什么有时不匹配不会报错,有时又会报错呢?

叫我小秦就好了的博客 1874

STM32实现简单的智能电梯控制

上述代码实现了一个简单的智能电梯控制器。电梯的状态包括IDLE(停止)、UP(向上移动)和DOWN(向下移动)三种状态。通过向上和向下按钮的按下,可以控制电梯移动到指定的楼层。在主循环中,不断读取当前楼层的按钮状态,并根据电梯状态决定执行的动作。具体的楼层数量和按钮的GPIO引脚可以根据实际情况进行调整。要实现简单的智能电梯控制,我们可以使用STM32微控制器来实现。

2401_85258012的博客 336

关于C++的placement new和placement delete

昨天发贴提了个问题,今天总结在这。原帖点击进入,有兴趣可以看看,我呆会儿还会说。 C++的new是语言自定义的操作符,这个操作符的行为包含两件事,而且你不能改变。 第一件事:调用operator new分配内存。所以通常说的重载new函数其实重载的是operator new,你无法重载new。 第二件事:调用你要new的对象的所属类的构造函数初始化第一步中分配的内存。这就是为什么你Obj

程序猿 9813

《手把手教你YOLOv9实战》,改进专栏目录

为了提供友好的操作效果,本专栏将会手把手搭建可视化界面,我将用PyQt5 搭建一个可视化界面,可视化界面能够实现基本的图像加载与检测功能,如支持视频、摄像头,还支持更换不同的 YOLOv9 模型,并适应不同领域(如口罩检测系统、人脸检测系统、工业缺陷检测系统等),界面灵活、功能强大。通过YOLOv9加以改进设计,形成新的算法框架,一起水科研和论文,专栏会一直持续更新中,本专栏适合目标检测、分割、分类。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 2154

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

C++经典面试题 | new/new[]和delete/delete[]的区别原理

1.先来谈谈new和delete 在C++中堆内存的分配和释放是通过new和delete来操作的,它们和C语言的malloc和free有什么区别呢? 1)new的底层也是通过malloc来开辟内存的,new比malloc多一项功能,就是开辟完内存,还可以进行初始化操作,如下: int *p = new int(10); 上面是new的基本操作,10代表堆上开辟的整形内存的初始值;如果是自定义类类型...

Lebron 7240

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

C++的new和delete深入

当我们去delete[]p2的时候,它一看这个[]就知道释放的是一个对象数组,那么就要从p2(0x104)上移4个字节,去取对象的个数,知道是5个对象了(一个对象是4字节),然后把ox104下的内存平均分成5份,每一份内存的起始地址就是对象的起始地址,然后传给对象的析构函数,就可以进行对象的析构了。现在加了[]表示有好几个对象,有一个数组,里面的每个对象都要析构,但是它是怎么知道是有5个对象呢?自定义的类类型,有析构函数,为了调用正确的析构函数,那么开辟对象数组的时候,会多开辟4个字节,记录对象的个数。

ljy的博客 1280

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

C++中new/delete和new[]/delete[]实例详解

直接进入正题! 首先,明确new和delete不是函数,是C++的运算符,支持重载。 其次,先简单了解一下new和delete的工作机制; string *sp = new string("hello"); string *arr = new string[10]; 上述代码实际执行分为三步: 1、new表达式调用名为operator new(或者operator new[])的标准库函数。该函数分配一块足够大小、原始的、为命名的内存空间; 2、编译器运行相应的构造函数,初始化第一步中申请的内

Bobhu1995的博客 1064

new、delete和malloc、free详解与混用问题

以前看到的资料都说,new和delete、new[]和delete[]、malloc和free,必须配套使用,不应该混用。 然而我最近遇到一些相关的问题,因此不得不探究一下,混用了会怎么样呢? 其实要想知道能不能混用,问题在于:他们有什么区别? 其实很简单: malloc只负责分配内存,free只负责释放内存。 new在分配内存的同时,还会调用构造函数;delete在释放内存的同时还会调用析构函...

凡辰道 7102

解析C++中的new、operator new、operator new[]和delete、operator delete、operator delete[](上)

最近在为一个Base项目实现需求,看到了大量的重载operator new/delete的轮子代码,而这方面之前并没有过多去关注,于是花了点时间,查一查资料,写了写Demo的代码,总算是对C++中new/delete这一家族的成员有了个了解。 我们一一来看。 1. new/delete以及对应的数组版本new[]/delete[]操作符(operator)。 这两组可以看作是一家的,也是我们

beyongwang的博客 2504

【C++】 new delete、new[] delete[] 详解

  C++ 中,new、delete 和 sizeof 一样,都不是函数,都是操作符。面试经常回问 malloc/free 和 new/delete的区别和联系: malloc/free 只是动态分配内存空间/释放空间,new/delete 除了分配空间还会调用构造函数和析构函数进行初始化与清理 它们都是动态管理内存的入口 malloc/free 是 C/C++ 标准库的函数,new/delet...

Bob__yuan的博客 2067

new[]与delete[]

new只比malloc多了个异常检测,不会额外开辟空间告诉delete[]要析构的次数,(其目的本也就是定义构造单个对象),所以,再调delete[],依然会向前int大小空间找析构次数,这没初始化的空间当然是随机值,可能很大可能很小,谁知道delete[]会析构多少次。operator new[]的底层是operator new[]与所有对象的构造,operator new[] 的底层是operator new,和。operator new[ ]实质做的:(加上构造为new[ ]做的)

2302_79765203的博客 862

new/delete相较于malloc/free的区别

一篇博客搞懂malloc/free和new/delete的区别

shylyly_的博客 1526

C++中的new, delete, new[]和delete[]

但对于不平凡的类,使用new[]申请内存时,会在第一个元素的前面记录元素的个数,当使用delete[]释放内存时,会先读取元素的个数,并调用对应次数的析构函数,最后释放内存;从上图中,我们还可以发现,栈中变量存储的顺序并不是我们定义的顺序,而是占用空间较大的变量会被存储在栈底,占用空间较小的变量会被存储在栈顶(栈的增长方向是从上往下)。直接看上面的输出结果,可能比较难以理解,根据上面的输出结果,我绘制了如下的堆栈信息图。的类型输出其中的内容,确实是为3,这也就验证了我们前面的说法,对于不平凡的类,

weixin_43364551的博客 532

关于new和delete,new[] 和delete[]

通常状况下,编译器在new的时候会返回用户申请的内存空间大小,但是实际上,编译器会分配更大的空间,目的就是在delete的时候能够准确的释放这段空间。这段空间在用户取得的指针之前以及用户空间末尾之后存放。实际上:blockSize = sizeof(_CrtMemBlockHeader) + nSize + nNoMansLandSize;其中,blockSize 是系统所分配的实际空间大

phymelinda的专栏 3575

C++ new和delete的原理分析

前言Effective C++ rule 16规则,让我重新认识了delete与new在处理数组时候的方式。new 有两种形式的new,一种是生成一个对象的operator New,另一个是用于数组的operator new []。同时 operator delete也分普通版本的operator delete 以及数组版的operator delete[].先说结论系列1.Operator new

jmhIcoding 8639
上一篇: 插入排序C+++实现
下一篇: Linux下Makefile操作
zsiming
博客等级 码龄7年 43粉丝 74原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值