深入剖析C++中的三种new

C++指针:从内存寻址到灵活应用的实战指南 本文深入解析C++指针的核心概念与实战应用。从内存寻址的本质出发,详细讲解了指针的定义、大小、空指针与野指针的陷阱,以及动态内存管理(new/delete)的正确用法。文章涵盖了指针与const的组合、指针在函数中的应用(值传递与地址传递),并通过动态数组、链表等实战案例,提供了避免内存泄漏和野指针的安全编程准则,是掌握C++指针编程的实用指南。 阅读详情
  1. new运算符
  2. Operator new()函数
  3. placement new

我们平时调用的new运算符底层调用的就是Operator new()函数(功能和malloc一模一样),如果是内置类型或者没有重载new运算符的自定义类型,那么将调用全局Operator new(),如果重载了将调用局部的Operator new(),如果这个类型有构造函数,new还是调用构造函数(注意调用构造函数之前还会吧operator new()的返回值检查一下,如果等于0那么就不调用构造函数)

验证1:new运算符底层调用的就是Operator new()函数

class A
{
public:
    A(){ cout << "构造" << endl; }
    int a;
};
int test2()
{
    A *b = new A;
    return 0;
}

这里写图片描述

验证2:内置类型或者没有重载new运算符的自定义类型,那么将调用全局Operator new(),重载了将调用局部的Operator new()

没有重载的汇编代码刚才已经看了,现在看一个重载之后的。
这里写图片描述
区别很明显吧!!

验证3:如果这个类型有构造函数,new还是调用构造函数
还是第一段代码
这里写图片描述

第二段代码(没有构造)
这里写图片描述
再看一个内置类型,和上面一模一样
这里写图片描述

验证4:构造函数之前还会吧operator new()的返回值检查一下,如果等于0那么就不调用构造函数
我们来重载一下new操作符

class A
{
public:
    A(){ cout << "构造" << endl; }
    int a;
    void * operator new(size_t size)
    {
        cout << "dong" << endl;
        return NULL;
    }
};
int test2()
{
    A *b = new A;
    return 0;
}

看一下汇编
这里写图片描述
最终执行的结果
这里写图片描述

如果我的代码这样写

class A
{
public:
    A(){ cout << "构造" << endl; }
    int a;
    void * operator new(size_t size)
    {
        cout << "dong" << endl;
        return (void *)1;
    }
};
int test2()
{
    A *b = new A;
    return 0;
}

结果就是
这里写图片描述

为啥是这样应该都能明白吧!!

验证5:为啥说功能和malloc一模一样

class A
{
public:
    A(){ cout << "构造" << endl; }
    int a;
    void * operator new(size_t size)
    {
        cout << "dong" << endl;
        return (void *)1;
    }
};
int test2()
{
    A *b = (A *)operator new (12);
    A *c = (A *)malloc(12);
}

看一下源码 VC/crt/src/newop.cpp

void *__CRTDECL operator new(size_t count) _THROW1(_STD bad_alloc)
    {   // try to allocate size bytes
    void *p;
    while ((p = malloc(count)) == 0)
        if (_callnewh(count) == 0)
            {   // report no memory
            _STD _Xbad_alloc();
            }
    return (p);
    }

其实底层就是调用的malloc

有人会奇怪我不是重载了operator new()么?为啥不打印?
因为我们调用的是全局operator new()啊,C++编译器在全局给我们默认创建了一个
那我们怎么调用自己类中的operator new()呢?没有对象我们能调用类中的函数么?
1.没有类对象我们是可以调用类中部分函数的。
2.更何况重载了operator new()编译器会自动帮我们把这个函数改为static的,也就是静态的。
所以不管是哪一方面都是可以调用的
这里写图片描述

然后我们看一看 定位new
这里写图片描述
下面 new A 就等价于上面两句话

注意上面这幅图我没有重载operator new(),因为如果重载了,定位new的时候会发生参数不匹配问题
如果你实在想调用自定义的operator new()可以这样写

A *p = (A*)operator new(sizeof(A));
A *a = new (p) A;

new的知识还是蛮多的

【C++深度剖析学习总结】 10 C++ 中的新成员new 学习交流可以添加 微信读者交流①群 (添加微信:coderAllen,备注加群) 程序员技术QQ交流①群:736386324 C++教程所有源码地址: https://github.com/lkk789/C-Learn-Source-code 1.动态内存分配 C++中通过new关键字进行动态内存申请 C++中的动态内存申请是基于类型进行的 delete关键字用于内存释放 10-1 C+... 阅读详情

相关推荐

银河麒麟V10-ARM架构-postgresql安装与部署指南

本文详细介绍应用源码进行pgsql的安装步骤,本文以postgresql-12.0为例。提示:以下是本篇文章正文内容,下面案例可供参考银河麒麟系统安装程序比较繁琐,潜在问题比较多,个人建议均通过源码自定义编译安装。国产系统还需努力啊!

idols_man的博客 1万+

C++中的new的用法

 关于c++ new操作符的重载 你知道c++ 的new 操作符和operator new 的区别么?也许你还会问,他们有区别吗?   当你写下面这样的代码时, string *pa = new string("memory managerment"); 你使用的是new 操作符,这个操作符和sizeof 一样,是c++ 语言级别支持的。你不能改变它的语义,它做的事情总是不变的:分

刘森林l的博客 1247

小米汽车技术路线

从小米的电子电器架构来看,行业内EEA已经由域集中逐渐过度到域融合+区域控制的架构并向着中央计算+区域控制的方向发展。 而小米汽车智驾算法也从基于高精地图模块化架构,到去高精地图模块化架构,再到端到端架构,这也正是行业对于智驾算法演进的共识。

HITbingdu的博客 3785

深入解析new、全局和局部operator new、::new、placement new

1. new分为两步 a、内存分配     调用相应的operator new( )分配内存   b、构造函数     调用相应的构造函数 实验代码: class T{ public: T(){ cout << "构造函数。" << endl; } ~T(){ cout << "析...

苞米地里捉小鸡的博客 1567

SE-0526激光避障雷达扫描传感器输入输出连线方法及PLC联机实例说明

SE-0526激光避障雷达扫描传感器广泛应用于原材料运输与处理、移动装配、托盘或货架运输、产成品自动运输、生产线自动对接,餐厅自助送餐等AGV小车、服务机器人、仓储机器人、无人叉车导航、避障、定位等。 本文重点介绍SE-0526激光避障雷达扫描传感器输入输出连线方法及PLC联机实例说明。

华翔天诚科技 2693

NT35310 LCD屏的初始化与图形显示实战:从画点到UI设计的完整指南

本文详细介绍了NT35310 LCD屏的初始化与图形显示实战,从硬件配置到UI设计全流程。内容包括8080总线连接、初始化序列、基础图形绘制算法、显示优化技巧以及UI框架实现,帮助开发者快速掌握TFT-LCD驱动开发技术,适用于工业控制和智能家居等嵌入式应用场景。

table的专栏 370

C++ 内存分配(new,operator new)详解

事实上,分配内存这一操作就是由operator new(size_t)来完成的,如果类A重载了operator new,那么将调用A::operator new(size_t ),如果没有重载,就调用::operator new(size_t ),全局new操作符由C++默认提供。然而,前面已经说过,new运算符的执行过程分为两步,C++提供new运算符的重载,其实是只允许重载operator new()函数,而operator()函数用于分配内存,无法提供构造功能。使用这种方法,直接调用类的构造函数。

wisdomroc的博客 1195

LeRobot 机器人学习(Robot Learning)入门教程(一)

本文介绍了现代机器人学习领域的发展现状与关键技术。随着机器学习进步和大规模机器人数据的普及,机器人技术正从传统基于模型的方法转向数据驱动的学习范式。HuggingFace开发的开源库lerobot实现了端到端集成,支持多种机器人平台和先进算法(强化学习、行为克隆等)。核心创新包括LeRobotDataset标准化格式,统一处理多模态时间序列数据,并支持高效批处理和流式访问。教程涵盖经典机器人学基础、强化学习原理、模仿学习技术和通用模型开发,结合代码示例展示如何构建适应多样化任务的机器人系统。该资源旨在为研究

2506_90492529的博客 1987

你真的明白“C++中的new”吗?

你真的明白“C++中的new”吗? 内存分配 内存释放 类型 是否可以重载 ::new ::delete 表达式 否 new delete 表达式 否 ::new[] ::delete[] 表达式

超级霸霸强的博客 2125

MATLAB基础应用精讲-【数模应用】信用评分模型(附R语言和python代码实现)

信用评分模型是近年来兴起的一种为了保障银行和其他金融部门的金融安全而设立的一种关于人身金融权限的划定模型。该模型指根据客户的信用历史资料,利用一定的信用评分模型,得到不同等级的信用分数,根据客户的信用分数,来决定客户所可以持有的金额权限,从而保证还款等业务的安全性。而随着在现代社会和公司中,贷款,信用卡的作用日渐突出,信用评分模型的发展前景不可估量。信贷风险是指借款人因偿还贷款或履行合同承诺而破产而产生损失的可能性。传统上,它与贷款人无法偿还所欠利息和本金、影响现金流和增加装配成本所产生的风险有关。

qq_36130719的博客 364

PX4从放弃到精通(二十二):日志

文章目录前言一、下载日志二、ulog转CSV三、利用flightplot软件分析PX4的ulog日志1 windos安装2 ubuntu18.04安装四、使用PlotJuggler分析PX4日志五、设置日志记录条件六、添加自定义日志消息 前言 PX4 1.10以上固件 QGC 一、下载日志 将飞控链接地面站,在下图页面点击“刷新”,即可看到保存的日志(前提是要有TF卡) 选择需要下载的日志,点击右侧的“下载”,然后选择目录即可进行下载,如果想擦除所有的日志,可以点击右侧的“擦除全部” 二、ulog转CS

超维空间科技的博客 6791

C++ new用法相关经验总结

C++编程语言中有一种叫做new的术语。不过这一概念是比较模糊的,有些人把它理解为new函数,但是有的人又会把它理解为new运算符。那么它的真正含义又是如何的呢?在这里我们将会通过对C++ new用法的介绍,帮助大家一起分析一下。C++ new用法之一 new运算符最常用的是作为运算符的new,比如:string *str = new string(“test new”);作为运算符,new和si...

weixin_30740295的博客 526

MC_SetOverride指令详细应用介绍(基恩士PLC)

基恩士KV系列PLC和松下总线绝对值伺服运动控制(详细配置+轴控完整ST源代码)

RXXW_Dor的博客 333

【C++进阶系列】:万字详解特殊类以及设计模式

一文带你掌握c++的特殊类以及单例模式!万字详解

努力努力再努力wz的博客 1786

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

【C++】 基础

编译器自动生成对应函数。用来定义模板参数,对于模板函数的使用,以供调用。,对于字符类型也是如此。,称为函数模板的。。和1. 用户自己来强制转化 2. 使用显式实例化显式实例化:在函数名后的<>中指定模板参数的实际类型如果类型不匹配,编译器会尝试进行隐式类型转换,如果无法转换成功编译器将会报错。一个非模板函数可以和一个同名的函数模板同时存在,而且该函数模板还可以被实例化为这个非模板函数对于非模板函数和同名函数模板,如果其他条件都相同,在调动时会优先调用非模板函数而不会从该模板产生出一个实例。

2503_92107148的博客 199

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

深度剖析C++的new、delete和placement new

如果申请的是内置类型的空间,new和mallocdelete和freenew/delete申请和释放的是单个元素的空间,new[]和delete[]申请的是连续空间,而且new在申请空间失败时会抛异常,malloc会返回NULL。调用函数申请空间在申请的空间上执行构造函数,完成对象的构造什么是内存泄漏:内存泄漏指因为疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并不是指内存在物理上的消失,而是应用程序分配某段内存后,因为设计错误,失去了对该段内存的控制,因而造成了内存的浪费。

qq_74013365的博客 2060

假人有限元模型

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

[C++] 关于new操作符的重载

关于c++ new操作符的重载 你知道c++ 的new操作符和operator new的区别么?也许你还会问,他们有区别吗? 当你写下面这样的代码时, string *pa = new string("memory managerment"); 你使用的是new操作符,这个操作符和sizeof一样,是c++语言级别支持的。你不能改变它的语义,它做的事情总是不变的:分配足够的内存以容纳对象,然后调...

selfsongs 5802

【C++破局】C++内存管理之new与deleted剖析

在c语言的学习过程中,我们学习了c语言的动态管理内容。本章的内容主要是从C/C++的内存分配区域入手,深入浅出的讲解C++的内存分配机制和new与delete。本章主要从C/C++的不同内存管理机制入手,深入浅出的讲解new和delete的底层原理和一些扩展知识。对于文章中涉及到内存池和抛异常等机制我们会在后续单独讲解,本章点到为止。希望能对大家深入理解new和delete有所帮助!作者水平有限,如有错误欢迎指正!

lovewold_的博客 1878

c++ new操作符

C++当中3种new的用法 | Fantacity 近在看侯捷侯老师的著作《STL源码剖析》,书中第二张开始讲到了stl中的allocator的一个简易实现,发现原来cpp中的new其实除了我们平常用的最多的new表达式(new operator)之外,还有剩下两种用法。 1. new operator/delete operator new operator,也叫new表达式,是我们在cpp中最常见的new的用法,比如: string *pStr = new string("abd")..

weixin_39187443的博客 5421

深入剖析C++ 中的New与Delete:内存管理的关键密码

 在 C++ 的内存管理之旅中,我们深入探索了new和delete这两个核心操作符 。从基础用法来看,new用于在堆上动态分配内存,为单个变量或数组开辟空间 ,int* numPtr = new int; ,int* arrPtr = new int[5]; ,而delete则负责释放new分配的内存,delete numPtr; ,delete[] arrPtr; ,确保内存资源的有效回收 。

大雨淅淅的博客 1152

C++中new/delete剖析及其宏模拟

new/delete/new[]/delete[]的剖析及其模拟

mac_timmy 875

C++:剖析new与delete实现原理

文章目录一、二、 一、 之前简单写了一篇关于new与delete使用文章:可以先看看这篇文章再回头来看。 C++:new与delete简单使用 二、

Rain的博客 1069

new与delete原理剖析

new与delete原理剖析

LVZHUO_2022的博客 1488

关于c++的new的剖析

声明数组时class a=new class[];则释放的时候一定要delete[] a,虽然delete a不会编译报错,但当数据类型是简单类型时没有什么问题,但是复杂类型时就无法释放数组后面的实例,因为delete[]会一次调用数组中对象的析构函数。。。。 当我们使用关键字new在堆上动态创建一个对象时,它实际上做了三件事:获得一块内存空间、调用构造函数、返回正确的指针。当然,如果

dick_china的专栏 635

jemalloc源码阅读:jemalloc_cpp.cpp C++支持实现

在高性能C++应用开发中,内存分配器的选择直接影响程序性能。jemalloc作为FreeBSD默认内存分配器,以其高效的多线程内存管理和低碎片特性著称。本文聚焦jemalloc源码中`jemalloc_cpp.cpp`文件,深度剖析其如何实现C++标准要求的内存分配接口,解决多线程环境下的内存管理难题。 ### C++内存分配的特殊性 C++标准定义了严格的内存分配/释放接口,包括: - 普通...

gitblog_00768的博客 499

深入篇【C++】C&C++内存管理:new/delete底层原理剖析+思维导图总结

深入篇【C++】C&C++内存管理:new/delete底层原理剖析+思维导图总结,带你深入理解C++!!!

Extreme_wei的博客 2282
上一篇: 京东2017实习生招聘在线笔试编程题
下一篇: C++虚表撞上虚继承后的内存布局
帅东
博客等级 码龄11年 676粉丝 88原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值