浅析C++中的 new 与 delete 操作

C++内置 new /delete 运算符浅析 因本人水平有限,错误之处在所难免,欢迎评论区交流指正。MicrosoftC++文档《高质量程序指南C++第三版.林锐》 阅读详情

new操作符(new operator)与operator new的关系,你想在堆上建立一个对象,应该用new操作符。它既分配内存又为对象调用构造函数。如果你仅仅想分配内存,就应该调用operator new函数;它不会调用构造函数。如果你想定制自己的在堆对象被建立时的内存分配过程,你应该写你自己的operator new函数,然后使用new操作符,new操作符会调用你定制的operator new。如果你想在一块已经获得指针的内存里建立一个对象,应该用placement new。
 我解释一下上面这段,int a=new int(4); 这句中,new会先调用opertor new(size_t,...)这个函数可以重载,且它的第一个参数只能是size_t(unsigned int)类型,它是专门用来分配内存空间的. 然后调用相应的构造函数来生成对象.
 如果重载了operator new(...) ,再使用 new 时,系统会调用重载过的operator new,下面的代码可供测试:
------------------------------------------
void*operator new(size_t a)
{
 cout<<"reload operator new"<<endl;      
 void*pTemp=malloc(a);
 return pTemp;
}
void main()
{
 int *a=new int(7);         //这里,会打印出一行:reload operator new
}
------------------------------------------
placement new 本身不是一个函数,它只是表示从指定位置的内存中去生成一个对象来.下面的代码可作为一个示例:
------------------------------------------
#include <new.h>                       //要引入头文件new.h
void*operator new(size_t a)
{
 cout<<"reload operator new"<<endl;
 void*pTemp=malloc(a);
 return pTemp;
}
void main()
{
 void *pTemp=operator new (1);    //申请一个空间.
 int *a=new(pTemp)int(8);    //把对象产生在这个空间中.
 cout<<*a<<endl;      //实际实用时,这个内存空间应该是比本示例更有意义的地方.
}
由此可见,placement new 的实际是new 的调用有点特别.

下面说一下delete,与new 一样,delete调用时,会先调用析构函数,然后operator delete 来释放空间,但在上面的placement new中,如果内存不是用operator new/new 得到的,比如对象在栈上或另一个堆对象的内部,则不应该调用delete来释放它.

深入一步谈下数组new 与delete:
 string *ps = new string[10];
     在上面这句代码中,被使用的new仍然是new操作符,但是建立数组时new操作符的行为与单个对象建立有少许不同。第一是内存不再用operator new分配,代替以等同的数组分配函数,叫做operator new[](经常被称为array new)。它与operator new一样能被重载。这就允许你控制数组的内存分配,就象你能控制单个对象内存分配一样. 注意,上面虽然有10个string对象,但operator new[]只会被调用一次,这也就是它相对于operator new的优势所在.下面的代码可简单验证:
void*operator new[](size_t a)
{
 cout<<"reload operator new"<<endl;
 void*pTemp=malloc(a);
 return pTemp;
}
void main()
{
 char *p=new char[7];       //只会打印一次reload operator new.
}
-------------------------------------------------
 另外,在释放数组空间时,使用的是:delete []char; 这里,会调用多次析构函数,再调用一次operator delete[],释放全部内存.下面的代码能很好地演示这一点:
--------------------------------------------------
void*operator new[](size_t a)          //重载数组内存分配函数.
{
 cout<<"reload operator new"<<endl;
 void*pTemp=malloc(a);
 return pTemp;
}
void operator delete[](void*pTemp)     //重载数组内存释放函数.
{
 cout<<"reload delete []"<<endl;
 free(pTemp);
}
class mycls        //定义一个类,实现其构造与析构函数.
{
public:
 mycls();
 ~mycls();
};
mycls::mycls()
{
 cout<<"constructor"<<endl;
}
mycls::~mycls()
{
 cout<<"destructor"<<endl;
}

void main()
{
 mycls *p=new mycls[5];      //这里将调用一次operator new[],五次构造函数
 delete []p;     //这里将调用五次析函数,一次operator delete[]
}

C++ operator new以及new operator的各种套路浅析 C++ operator new以及new operator的各种套路浅析 在C++中动态分配内存很简单:new是分配,delete是释放,就这么简单。然而,这篇文章讲得要复杂一点,并且要考虑到自定义层次。这也许对简单的程序并不重要,但对你在代码中控制内存却是十分必要的,是否能写一个自定义的分配器,某种高级内存管理表或一个特定的垃圾回收机制。 阅读详情

相关推荐

【C/C++】浅析new/delete和malloc/free之间的关系

对new/delete和malloc/free的用法、区别及联系做了简单分析,加深对动态开辟内存的理解。

Ananbei的博客 1172

C++自动释放new的对象

问题简介 相信用C++或者C的朋友,都会遇见这样情况,在函数中需要一个内存空间或者一个对象数组(new A[n]),因为空间的大小或者对象数组的长度非固定,无法在栈中固定分配,只能通过new的方法。但是程序中有多个返回return的地方,通常C程序员转过来做C++的,经常会忘记在某个返回的地方,释放已分配的对象,导致内存问题。实际情况如这样: int fun(void) { A *ap = new A; ... if (...) { delete ap; return -1; } B *b

weixin_43288612的博客 8483

使用这个算法我可以实现英雄联盟里英雄的走位|Java 开发实战

A算法,A(A-Star)算法是一种静态路网中求解最短路径最有效的直接搜索方法,也是解决许多搜索问题的有效算法。算法中的距离估算值与实际值越接近,最终搜索速度越快。 基本概念 首先在大学我们遇到最多的算法Dijkstra、Floyd、广度搜索、深度搜索。关于这些算法我们以后再慢慢的研究,今天的重点在A算法上。A算法是一种启发式算法。与上述几种算法不同的是A*算法在考虑起始节点的同时还会考虑到目标节点的代价。 在A*算法中我们给每个节点都定义一些属性。最基本的就是下文提到的三基数-这里的三基数是我自己定义.

Java进阶营 312

C++:new和delete的用法

上面我们用“new int[10];堆区开辟的数据,由程序员手动开辟,手动释放,释放利用操作符。利用new创建的数据,会返回该数据对应的类型的指针。栈区:函数的形参,非静态的局部变量。delete运算符使用的一般格式为。例如要撤销上面用new开辟的空间用。堆区:用于程序运行时动态内存分配。在堆区利用new开辟数组。操作符在堆区开辟数据。

m0_73648729的博客 1067

从零到一:用AXI DataMover在Zynq MPSoC上实现高效DMA传输(附Vitis HLS驱动示例)

本文详细介绍了如何在Xilinx Zynq UltraScale+ MPSoC平台上使用AXI DataMover实现高效的DMA数据传输。通过解析AXI DataMover架构、Vivado工程配置、Vitis HLS驱动开发及性能优化技巧,帮助开发者快速构建高性能数据传输通道,并提供了可直接复用的代码示例。

weixin_42520796的博客 424

MATLAB实战:纯电动汽车动力性仿真从入门到精通(附完整代码)

本文提供了一份基于MATLAB的纯电动汽车动力性仿真从入门到精通的实战指南。通过理论建模与代码实战相结合,详细讲解了如何构建行驶阻力模型、驱动力平衡方程,并利用MATLAB脚本完整实现了最高车速、加速时间和最大爬坡度三大核心性能指标的仿真计算。文章附有完整代码,帮助工程师快速掌握纯电动汽车动力性仿真的核心技能,为设计与优化提供高效的数字工具。

weixin_29074409的博客 369

malloc与new方法动态创建数组并释放

#include using namespace std; int main(){ //动态创建释放一维数组(new) int *a;//基地址 int n=10;//数组大小 a=new int[n];//创建     delete[] a;//释放 //动态创建释放二维数组(new) int **b; int m=10;n=10; b=new int*[m]; for(

LLXLQY的博客 2122

PCIe控制器深度解析-RK3588 PCIe子系统核心模块探秘

本文深度解析了RK3588芯片中PCIe子系统的核心架构与功能模块。文章将PCIe控制器比作智能交通枢纽,详细阐述了RADM、XADM、CDM、eDMA等核心模块的工作原理,包括数据流管理、地址转换、DMA加速及电源管理。旨在帮助开发者和硬件工程师深入理解RK3588 PCIe控制器的内部机制,为驱动开发、性能优化和故障排查提供清晰的思路与实用指导。

weixin_29246195的博客 188

C++中delete函数

在C++中delete函数用于回收new分配的内存空间。 C++告诉我们在回收用 new 分配的单个对象的内存空间的时候用 delete,回收用 new[] 分配的一组对象的内存空间的时候用 delete[]。 关于 new[] 和 delete[],其中又分为两种情况:(1) 为基本数据类型分配和回收空间;(2) 为自定义类型分配和回收空间。 在针对简单的基本数据类型,使用delete也可以回收 new[] 分配的一组对象的内存空间,因为:基本的数据类型对象没有析构函数,并且new 在分配内存时会记

weixin_41275864的博客 1万+

Python 逆向解析知乎盐选反爬字体,实现内容精准还原

本文详细解析了知乎盐选内容的反爬字体机制,并提供了使用Python逆向解析WOFF字体文件的完整方案。通过fontTools库构建解码字典,实现乱码文本的精准还原,帮助开发者应对动态字体策略,同时强调法律与道德风险。

weixin_29268385的博客 1295

20、啁啾脉冲光纤放大器:原理、设计与仿真

本文详细介绍了啁啾脉冲光纤放大器(FCPA)的原理、设计与仿真过程。内容涵盖CPA技术的基本原理、光纤基CPA系统的组成、Tm掺杂光纤放大器的工作机制、全光纤脉冲展宽器的设计以及仿真分析。通过MATLAB仿真展示了脉冲在光纤中的展宽与放大过程,并讨论了如何优化系统以减少非线性失真、控制峰值功率并提高整体性能。文章还总结了系统优化的关键策略,并展望了未来的发展方向。

v4w5x6的博客 318

C++ =delete的使用

背景 今天看公司的编程规范,其中有个原则: 如果你的类不需要拷贝/移动操作,请显式的通过在public域中(private本身就是不能显式的直接调用的)使用 =delete 或其他手段禁用之; 对其中的 =delete不了解,之前没用过,查了一下以此为记; =delete 使用方式 C++11中=delete的巧妙用法 #include <cstdio> class TestClass { public: int func(int data)=delete; }; 那么如果使用时: i

lqw198421的专栏 7975

反光柱定位算法实战03:VEnus代码解析和纯反光柱定位中的可改进方向

本文深入解析了开源框架VEnus的反光柱定位与建图实现流程,包括强度提取、聚类、数据关联、位姿优化等核心模块。同时指出其三大局限:匹配质量脆弱性、单一传感器依赖和地图扩展逻辑缺失,并提出改进方向:融合里程计/IMU数据、引入图优化后端、建立动态地图维护机制。该分析为基于反光柱的定位系统优化提供了实用参考,有助于提升工业场景下的定位鲁棒性和精确性。

Studying…… 520

关于STM32的C++使用的那些事,(C工程变C++工程),new和delete的实现

最近要用到C++来写keil工程,要把之前的C工程变成C++工程,好家伙。 学习一下keil怎么建立一个C++工程,还有STM32在C++语言下怎么兼容C。 1.keil工程的魔法棒设置 我这里选择的是版本5,我看网上说要版本6,不是很理解。 然后选择不要使用微库,C++不支持MicroLIB 2.选择编译的方法 把C99Mode选项去掉,然后改成–cpp11 3.把中断函数全部都要加extern “C” 例如 或者在头文件中加上 #ifdef __cplusplus extern "C" { #end

qq_34985000的博客 3380

手把手教你学simulink(40.1)--水力发电场景示例:基于 Simulink 的抽水蓄能电站水力发电

项目背景抽水蓄能电站是一种重要的储能技术,广泛应用于电力系统的调峰填谷、频率调节和备用电源。它通过在电力负荷低谷时将水从下水库抽到上水库储存,在电力负荷高峰时释放水进行发电,从而实现电能的高效利用。与传统的水电站不同,抽水蓄能电站可以在短时间内快速响应电网的需求,具有良好的灵活性和可靠性。本项目旨在使用 MATLAB/Simulink 模拟一个完整的抽水蓄能电站的水力发电过程,包括水泵-涡轮机系统、发电机、水道系统、控制系统等,并实现对电站的精确控制,确保其在不同工况下都能稳定运行。

MHD0815的博客 885

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

C++ 中 malloc/free 与 new/delete 浅析

new/delete 通常来说是操作符,就是"+","-"一样,malloc/free 是 C++/C 语言的标准库函数 —— 本质区别。本文主要从以下5各方面比较、分析 malloc/free,new/delete 的区别 。 1.自动地分配所需空间。2.自动返回指针类型。3.初始化不同。4.源码实现不同。5.常见问题为什么有了new不剔除malloc。

稚枭天卓 6754

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

浅析C++内存分配器:malloc/free与new/delete的差异

核心差异是底层内存操作工具,不管理对象生命周期;new/delete是C++面向对象的核心机制,集成构造、析构和类型安全。使用建议:在C++中,优先使用new/delete(尤其涉及类对象),以利用RAII和异常安全;仅在需要与C代码交互或低级优化时使用。关键公式:内存大小计算差异可总结为:new:自动处理$ \text{sizeof}(T) $和初始化。通过以上分析,您可更安全高效地选择内存分配器。若有具体场景疑问,可进一步探讨!

2501_93895308的博客 766

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

浅析C++中的new operator

<br />浅析C++中的new operator<br />因为这几天想模拟vector,但是对C++的内存管理机制不太了解,所以近段时间一直在关注并搜索着相关信息,我会在我的博客中陆续把成果写出来,以供大家参考。<br />经过查阅资料,发现C++在new系统类型和用户自定义的类型时对内存的分配是不一样的。我们看下边的一段代码:<br /><br />#include <iostream> using namespace std; class MyClass { int a; publi

Kunsa的编程专栏 1205

浅析C++中的动态内存分配

在C语言中,我们学到了使用malloc/calloc/relloc来进行内存的动态开辟,用free来完成内存的释放。而在C++中是通过new和delete这两个操作符来实现的。当然C++中也可以使用C语言那套内存管理的方法,毕竟C++是兼容C语言的。一.首先我们来了解一下new和delete的基本语法。int main() { int* p1=new int;//开辟空间 delete p1;...

qq_39344902的博客 4803

C++中的delete浅析

最近用到了delete用法,在此总结一下。         delete用于释放由new操作法创建的对象或对象数组的内存空间,有两种基本语法:1)delete ;2)delete[];         1)delete用法         e.g: class animal                          {                            ...

u012422446的博客 1974

CC26.【C++ Cont】动态内存管理(new和delete)浅析和面向对象的方式实现链表

有关malloc和new,delete和free的区别这里不做讲解,竞赛中只需要知道怎么用就行。注:为防止new开辟空间失败,建议判断p1和p2是否为空,或者assert断言。注:new不是只能给内置类型开辟空间,也可以给自定义类型开辟空间,例如结构体。格式:delete 指针 或 delete[] 指针(数组的空间)new返回的是申请到的内存空间的起始地址,因此需要指针来接收。和C语言一样,在堆区上自行申请空间和释放空间,new申请一个变量的空间,new。申请连续的内存空间即申请数组空间。

zhangcoder的博客 记录学习轨迹~ 1490

浅析C++野指针/delete

简单说一下对指针执行delete操作后,指针发生什么变化

Ninth 1303

c 语言 new 多类型 如何实现,深入浅析C++的new和delete

new和delete的内部实现C++中如果要在堆内存中创建和销毁对象需要借助关键字new和delete来完成。比如下面的代码class CA{public:CA()m_a(0){}CA(int a):m_a(a){}virtual void foo(){ cout<int m_a;};void main(){CA *p1 = new CA;CA *p2 = new CA(10);CA *p3...

weixin_33206646的博客 402

new和delete浅析以及与malloc和free区别的简总

new和delete new/delete是C++动态开辟内存运算符,malloc和free是C库函数实现的动态开辟内存的。 new/delete new和delete其实也是重载函数,其底层也是调用malloc和free包括new数组和delete数组也是重载new[] 和 delete[] 运算符。也可以自己实现new和delete的重载函数。 那么new单个元素delete单个元素,new数组,delete[]数组到底有什么区别的,混用到底有什么问题,下面我们使用代码来说明问题 // 重载new和ne

weixin_43604792的博客 237

浅析C++内存管理(一):new和delete

本文介绍C++内存管理,讲解了堆栈、new和delete、以及智能指针等。

量化开发技术点集锦 481
上一篇: 我的大学
下一篇: 在深圳300元/月的小资生活
biblereader
博客等级 码龄20年 11粉丝 18原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值