new、new[]和new()

文章目录

    • new是怎么调用的?
    • 那么delete呢?
    • new[]和delete[]为什么要成对使用?
    • 注意到了operator new和operator delete~
    • new()怎么用?
    • delete()有点复杂


new是怎么调用的?

这里是一条new的使用语句:

A *pc = new A(1, 2);

这条语句,编译器会转化为下面样子:

A* pc;
try {void* mem = operator new(sizeof(A)); //申请内存pc = static_cast<A*>(mem);           //类型转换pc->A::A();                          //调用构造函数
}
catch (std::bad_alloc) {......
}

所以,当我们使用new的时候,它有两个作用:一是申请内存,二是调用相应的构造函数

那么delete呢?

这是一条司空见惯的delete的使用语句:

delete pc;

一样的,编译器也将该语句转化为下面这样:

pc->~A();                  //调用析构函数
operator delete(pc);             //释放内存

那么,delete的作用就是先调用相应的析构函数,再释放内存

new[]和delete[]为什么要成对使用?

调用了new[]为什么一定要调用delete[]?对于不包含指针的成员变量的类来说可能没有影响。但是对于包含有指针的成员变量来说通常都存在影响(见下图)。

string *pStr = new String[3];
delete[] pStr;

new出对象的内存分布
上图是new出对象的内存分布图。
因为delete[]会唤起多次析构函数,当存在带有指针变量时,在delete[]时需要先调用析构函数处理这些指针指向的空间。如果上图仅仅执行delete pStr,表示只调用了一次析构函数,处理了其中的一个指针指向的空间后就进行了释放了pStr所指向的内存,这样就造成了内存泄露

注意到了operator new和operator delete~

这两个函数是 C++ 语言标准库的库函数,原型如下:

void *operator new(size_t);        //allocate an object
void *operator delete(void *);    //free an objectvoid *operator new[](size_t);     //allocate an array
void *operator delete[](void *);    //free an array

具体代码这里就先不谈,只需要知道operator new和operator new[]调用了malloc,operator delete和operator delete[]调用了free即可(嗯,很多创建删除新对象什么的函数最后的指向都是malloc和delete)。
同时,以上四个函数都是可以重载的,一般默认调用的是全局的operator new,operator new[],operator delete和operator delete[]。但是,我们对这两个函数进行重载的时候,很少会对全局的operator new,operator new[],operator delete和operator delete[]进行重载,这样做的话,那影响可太大了。因此,我们都是在类中对这两个函数进行重载(记得是static,不过编译器也默认为该类函数是static,毕竟对象都没有,怎么由对象调用该函数创建对象)。

new()怎么用?

首先看看这段代码:

char *buf = new char[sizeof(A)*3];
A *pc = new(buf) A(1,2);

这段代码中的new()也称作定点new,这是因为这个new不需要自己申请空间,直接就在我们传进去的buf里调用构造函数创建对象。被编译器转化为如下:

A* pc;
try {void* mem = operator new(sizeof(A), buf); //申请内存pc = static_cast<A*>(mem);                //类型转换pc->A::A();                               //调用构造函数
}
catch (std::bad_alloc) {......
}

而这里的operator new的代码如下:

void* operator new(size_t, void* loc)
{return loc;
}

没有自己申请空间,只是将loc的地址返回。
但是new()还有别的形式,这些可不是定点new。比如下列代码:

A *pA = new(100, 'a') A;

也就是重载了类成员operator new(),使其参数列表不同。但是第一个参数必须是size_t,其余参数以new所指定的参数为初值(这是因为没有小括号的时候,类的代大小会被传递给operator new作为第一个参数,此时的类型就是size_t)。

delete()有点复杂

当然,我们也可以重载类成员operator delete(),但是一般来说是绝对不会被delete调用的。只有当new所调用的构造函数抛出异常时,才会调用这些相对应的重载的operator delete()。这样设计的目的是归还未能完全创建成功的object所占用的memory。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/1381365.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

Bootstrap颜色对应对照表

Bootstrap自带颜色&#xff1a;class "bg-xxx" bg-red红色bg-yellow黄色bg-aqua湖绿色bg-blue蓝色bg-light-blue浅蓝色bg-green绿色bg-navy藏青色bg-teal青色bg-olive橄榄色bg-lime荧光绿 bg-orange橙色bg-fuchsia紫红色bg-purple紫色bg-maroon红褐色bg-black黑色b…

BLE蓝牙

简介 重点了解GAP、ATT、Link Layer&#xff0c;其它有个简单认识即可 1. 什么是蓝牙主从关系&#xff1f; BLE蓝牙的角色有以下几种&#xff1a;广播者&#xff08;duAdvertise&#xff09;、扫描者&#xff08;Scanner&#xff09;、从设备zhi&#xff08;daoSlave&#x…

Bootstrap 样式之 元素背景颜色

在Bootstrap中既有文本颜色的样式也有元素背景颜色的样式&#xff0c; 我们先来看看元素背景的颜色有哪几种&#xff1f; 一共五种背景色&#xff1a;分别是 bg-primary bg-success bg-info bg-warning bg-danger 代码&#xff1a; <!DOCTYPE html> <…

HTB-Nibbles

HTB-Nibbles 信息收集开机 信息收集 nmap ssh 22http 80 gobuster和dirbuster 看看源码 一眼看到admin.php nmap sshhttp 看网页源码 nibbleblog gobuster和dirbuster admin.php一堆文件 开机 边查找文件边尝试了几个登陆密码&#xff0c;但是这几个密码都失败了。…

Bootstrap 颜色

一、Bootstrap 颜色 1.1 基本颜色 Bootstrap4 提供了一些有代表意义的颜色类&#xff1a;.text-muted, .text-primary, .text-success, .text-info, .text-warning, .text-danger, .text-secondary, .text-white, .text-dark and .text-light: <div class"container&q…

NewBlueFX TotalFX7 v6.0.200108 (x64) for AE/Premiere WIN版本

用于Adobe AfterFX和Premiere Pro WIN的NewBlueFX TotalFX7 v6.0.200108&#xff08;x64&#xff09; TotalFX具有177种效果的1,500多个预设。这是我们最全面的字幕工具&#xff0c;过渡&#xff0c;过滤器和视频编辑插件套件。获取所有NewBlue视频效果集合的功能齐全的Ultima…

BNext

又搬来了大神器啊 来自德国HassoPlattner计算机系统工程研究院的NianhuiGuo和HaojinYang等研究者提出了BNext模型&#xff0c;成为第一个在ImageNet数据集上top1分类准确率突破80%的BNN。 两年前&#xff0c;依靠早期 BNN 工作 XNOR-Net 起家的 XNOR.AI 被苹果公司收购&#…

HybridCLR 热更新介绍

HybridClr介绍 C# -> HybridCLR 热更新介绍 以下讲简单阐述下个人理解的Hclr的相关知识&#xff0c;以及在使用中遇到的坑点. 在使用HybridCLR 前的一些基本知识储备 为了方便下文的更好的理解,建议大家先简单过一下下文的一些名称和一些简单的知识点&#xff1a; Comm…

tkinter文件对话框

文章目录 文件对话框文件对象文件类型其他参数 tkinter系列&#xff1a; GUI初步&#x1f48e;布局&#x1f48e;绑定变量&#x1f48e;绑定事件&#x1f48e;消息框扫雷小游戏&#x1f48e;强行表白神器 文件对话框 filedialog提供了多种与文件交互相关的对话框&#xff0c…

bluestore

BlueStore BlueStore 架构及原理分析 Ceph 底层存储引擎经过了数次变迁&#xff0c;目前最常用的是 BlueStore&#xff0c;在 Jewel 版本中引入&#xff0c;用来取代 FileStore。与 FileStore 相比&#xff0c;Bluesore 越过本地文件系统&#xff0c;直接操控裸盘设备&#x…

Bootstrap系列之颜色(Colors)

文章の目录 1、字体颜色2、背景颜色3、背景渐变写在最后 通过少量的颜色类来传达颜色的含义。还包括对具有悬停状态的链接样式的支持。 处理专一性 有时由于另一个选择器的专一性而不能应用上下文类。在某些情况下&#xff0c;一个足够的解决方法是用类将元素内容包装在<div…

Bluethooth

阅读时长10分钟 蓝牙技术是一种近距离无线连接技术。能在包括移动电话、PDA、无线耳机、笔记本电脑、相关外设等众多设备之间进行无线信息交换。 历史&#xff1a;蓝牙技术是世界著名的 5 家大公司一爱立信(Ericsson)、诺基亚(Nokia)、东芝(Toshiba)、国际商用机器公司(IBM)和英…

NewBlue Titler Pro 7不能预览 预览黑屏

问题描述 最近在剪辑视频 使用“NewBlue Titler Pro 7 Ultimate 7.4.201109”和谐版增加字幕时&#xff0c;出现字幕刚开始可以预览&#xff0c;动几下鼠标预览窗口卡死&#xff0c;随后黑屏。 解决方式 折腾之后发现用的版本不对&#xff0c;更换为下面的版本后可以正常使用…

华为od统一考试B卷【九宫格按键输入法】Python 实现

所有题目均有五种语言实现。C实现目录、C++ 实现目录、Python实现目录、Java实现目录、JavaScript实现目录 题目 九宫格按键输入,判断输出,有英文和数字两个模式,默认是数字模式,数字模式直接输出数字,英文模式连续按同一个按键会依次出现这个按键上的字母,如果输入”/…

华为od统一考试B卷【九宫格按键输入法】Java 实现

所有题目均有五种语言实现。C实现目录、C++ 实现目录、Python实现目录、Java实现目录、JavaScript实现目录 题目 九宫格按键输入,判断输出,有英文和数字两个模式,默认是数字模式,数字模式直接输出数字,英文模式连续按同一个按键会依次出现这个按键上的字母,如果输入”/…

2022华为机试真题 C语言 实现【九宫格按键输入法】

九宫格按键输入,判断输出,有英文和数字两个模式,默认是数字模式,数字模式直接输出数字,英文模式连续按同一个按键会依次出现这个按键上的字母,如果输入”/”或者其他字符,则循环中断。 要求输入一串按键,输出屏幕显示。 输入描述: 输入范围为数字 0~9 和字符’#’、…

谷歌键盘切换26键与九宫格中文输入法

今天不小心把手输入法改成了九宫格&#xff0c;很不习惯&#xff0c;在设置里面找了很久也没找到&#xff0c;百度也没有找到答案。 最终偶然发现解决方案。 长按【中】出现如下界面&#xff0c;即可切换26键与九宫格。

Python之九宫格输入

文章目录 前言一、问题描述二、问题解决 前言 九宫格输入是一款手机平台的必备利器。假设有九宫格输入法键盘布局如下&#xff1a;‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬…

九宫格按键输入c++

假设有九宫格输入法键盘布局如下&#xff1a; [ 1,.?! ] [ 2ABC ] [ 3DEF ] [ 4GHI ] [ 5JKL ] [ 6MNO ] [ 7PQRS ] [ 8TUV ] [ 9WXYZ ] [ 0空 ] 注意&#xff1a;中括号[ ]仅为了表示键盘的分隔&#xff0c;不是输入字符。 每个中括号中&#xff0c;位于首位的数字字符即是…

centos7部署openldap开启memberof并接入jumpserver

文章目录 前言1.yum安装openldap2.配置密码3.导入配置4.定义域5.配置memberof6.配置base dn7.安装phpldapadmin管理8.调整httpd的配置9.调整php的配置10.登陆php管理页面11.同步旧ldapsever用户数据(可省略)12.客户端配置13.对接jumpserver 前言 介绍如何在centos7上部署openl…