C++定位new用法及注意事项

news2024/9/27 7:22:44
使用定位new创建对象,显式调用析构函数是必须的,这是析构函数必须被显式调用的少数情形之一!,
另有一点!!!析构函数的调用必须与对象的构造顺序相反!切记!!!
定位new的使用格式:
1.new (place_address) type
2.new (palce_address) type (initializer_list)
其中place_address必须是一个指针,initializer_list是type类型的初始化列表

使用请看下面的代码例程

#include <iostream>
#include <string>
#include <new>
using namespace std;


const int BUF = 512;
class JustTesting {
private:
    string words;
    int number;
public:
    JustTesting(const string& s = "Just Testing", int n = 0) {
        words = s;
        number = n;
        cout << words << " constructed" << endl;
    }
    ~JustTesting() { cout << words << " destroyed!" << endl; }
    void Show()const { cout << words << " , " << number << endl; }
};

int main() {
    char* buffer = new char[BUF];//常规new在堆上申请空间
    cout << "\nMemory block address:\n" << "buffer: " << (void*)buffer
         << "\n****************************************\n";

    JustTesting* pc1, * pc2;
    pc1 = new (buffer) JustTesting;//定位new
    pc2 = new JustTesting("Heap1", 20);//常规new

    cout << "\nMemory contents:" << endl;
    cout << pc1 << ": ";
    pc1->Show();
    cout << pc2 << ": ";
    pc2->Show();

    cout << "----------------------------------------\n";

    JustTesting* pc3, * pc4;
    pc3 = new (buffer)JustTesting("Bad Idea", 6);//定位new
    pc4 = new JustTesting("Heap2", 10);//常规new

    cout << "\nMemory contents:" << endl;
    cout << pc3 << ": ";
    pc3->Show();
    cout << pc4 << ": ";
    pc4->Show();

    delete pc2;//释放pc2申请的空间
    delete pc4;//释放pc4申请的空间
    delete[] buffer;//释放buffer指向的空间,但是这里并没有调用其析构函数
    //pc3->~JustTesting(); //需要显式调用构造函数
    //pc1->~JustTesting();
    cout << "Done!" << endl;
    return 0;
}

执行结果如下:

结果分析: 

1.使用定位new创建的对象的地址与内存缓冲区地址一致,说明定位new并没有申请新空间,而构造函数的调用说明定位new的确调用了构造函数。
2.在使用delete回收空间时,可以发现并未回收pc1与pc3,其原因在于pc1与pc3指向的对象位于内存缓冲区,该空间并不是定位new申请,而是常规new申请的,因此我们需要delete[]回收内存缓冲区,而不是delete pc1与delete pc3
3.pc1与pc3一致,说明第一个对象被第三个覆盖!显然,如果类动态地为其成员分配内存,这将引发问题!,所以,当我们使用定位new创建对象必须自己保证不会覆盖任何不想丢失的数据!,就这个例程而言,避免覆盖,最简单的做法如下:
        pc1 = new (buffer) JustTesting;
        pc3 = new (buffer + sizeof(JustTesting)) JustTesting("Better Idea!",6);
4.delete[] buffer并未引发对象的析构!,虽然对象1及3的空间被回收,但对象1与3并未析构!这一点将时刻提醒我们使用定位new需要自己显式调用析构函数,完成对象的析构!,但该析构并不能通过delete pc1或delete pc3实现!(因为delete与定位new不能配合使用!,否则会引发运行时错误!),只能通过显式析构,如下:
        pc3->~JustTesting();
        pc1->~JustTesting();

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

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

相关文章

分步骤详解随机生成一个登录验证码的算法,最后给出完整代码

需要安装第三方模块pillow import randomfrom PIL import Image, ImageDraw, ImageFont步骤一&#xff1a;编写一个生成随机颜色的函数 def get_random_color():return random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)步骤二&#xff1a;在面板里放…

31 岁生日快乐,Linux!

Linux 迎来了 31 岁生日&#xff0c;所以和我一起庆祝 Linux 的 31 岁生日吧&#xff0c;喝上一杯好香槟和一个美味的蛋糕&#xff01;虽然有些人不承认 8 月 25 日是 Linux 的生日&#xff0c;但我知道。1991 年 8 月 25 日&#xff0c;21 岁的芬兰学生 Linus Benedict Torval…

三种方式查看linux终端terminal是否可以访问外网ping,curl,wget

方法1&#xff1a;ping注意不要用ping www.google.com.hk来验证&#xff0c;因为有墙&#xff0c;墙阻止了你接受网址发回的响应数据。即使你那啥过&#xff0c;浏览器都可以访问Google&#xff0c;terminal里面也是无法得到响应 百度在墙内&#xff0c;所以可以正常拿到响应信…

二分法攻略

本节内容只有通过例题来记录效果才是最好的,请看下面内容&#xff01; 递归实现二分法 经典二分查找问题&#xff1a;LintCode 炼码 描述**&#xff1a;**在一个排序数组中找一个数&#xff0c;返回该数出现的任意位置&#xff0c;如果不存在&#xff0c;返回 -1。 输入&…

java spring完全注解开发

其实学习注解之后 我们也只有一个开启扫描需要xml的配置了 而 这一步 其实也是可以写到类里面的 我们这边先创建一个java项目 然后引入 spring需要的几个基本包 在src中创建一个包 叫 Bean Bean下创建 一个包 叫 UserData UserData 包下创建一个类 我这里叫 User 参考代码如…

Java List集合

6 List集合 List系列集合&#xff1a;添加的元素是有序&#xff0c;可重复&#xff0c;有索引 ArrayList: 添加的元素是有序&#xff0c;可重复&#xff0c;有索引LinkedList: 添加的元素是有序&#xff0c;可重复&#xff0c;有索引Vector &#xff1a;是线程安全的&#xff…

初识数据仓库

一、什么是数据仓库数据库 --> OLTP&#xff1a;&#xff08;on-line transaction processing&#xff09;翻译为联机事务处理记录某类业务事件的发生&#xff0c;如购买行为&#xff0c;银行交易行为&#xff0c;当行为产生后&#xff0c;系统会记录是谁在何时何地做了何事…

day11_python虚拟环境安装与配置

文章目录Windows下安装第一步&#xff0c;安装virtualenv改源参考第二步&#xff0c;安装virtualenvwrapper-winUbuntu下安装第一步、安装virtualenv和virtualenvwrapper第二步、配置.bashrc文件&#xff0c;添加下面三行第三步&#xff0c;用下列命令让修改后的.bashrc生效配置…

今天来聊一聊信息差,或许会刷新你的认知

有人会说&#xff1a;现在互联网信息这么发达&#xff0c;获取信息的渠道也越来越多&#xff0c;还会存在信息差吗&#xff1f;我的回答是&#xff1a;会&#xff0c;而且随着社会高速的发展&#xff0c;信息差会越来越明显。这里大家需要了解一个词&#xff1a;信息茧房信息茧…

植物育种中广义遗传力的定义

大家好&#xff0c; 我是邓飞。 今天聊一下广义遗传力的计算方法。 广义遗传力定义 广义遗传力&#xff08;H2H^2H2&#xff09;定义为归因于基因型总体遗传变异的表型变异比例。 通常他包括三个解释&#xff1a;&#xff08;详见我这篇博客的公式推导 回归系数 相关系数 遗…

微信小程序_调用openAi搭建虚拟伙伴聊天

微信小程序_调用openAi搭建虚拟伙伴聊天背景效果关于账号注册接口实现8行python搞定小程序实现页面结构数据逻辑结速背景 从2022年的年底&#xff0c;网上都是chagpt的传说&#xff0c;个人理解这个chatgpt是模型优化训练&#xff0c;我们在用chatgpt的时候就在优化这个模型&a…

九龙证券|连续13周净流入!北向资金爆买“中字头”股票

Wind数据显现&#xff0c;本周北向资金净流入A股达29.33亿元&#xff0c;其间周四净流入121亿元&#xff0c;其他四个交易日均为净流出状况。尽管本周北向资金流入A股力度放缓&#xff0c;可是仍然保持着周度接连净流入态势。 接连第13周净流入 Wind数据显现&#xff0c;从202…

Redis核心知识点

Redis核心知识点Redis核心知识点大全五种数据类型redis整合SpringBoot序列化问题渐进式扫描慢查询缓存相关问题数据库和缓存谁先更新缓存穿透缓存雪崩缓存击穿实际应用超卖问题分布式锁全局唯一ID充当消息队列Feed流附近商户签到HyperLogLog实现UV统计持久化RDBAOF持久化小结事…

整型提升+算术转换——“C”

各位CSDN的uu们你们好呀&#xff0c;今天小雅兰的内容是之前操作符那篇博客中没有讲完的内容&#xff0c;整型提升这个小知识点也非常重要&#xff0c;那现在&#xff0c;就让我们进入操作符的世界吧 隐式类型转换 算术转换 操作符的属性 隐式类型转换 表达式求值的顺序一部…

opencv显示图像

大家好&#xff0c;我是csdn的博主&#xff1a;lqj_本人 这是我的个人博客主页&#xff1a; lqj_本人的博客_CSDN博客-微信小程序,前端,python领域博主lqj_本人擅长微信小程序,前端,python,等方面的知识https://blog.csdn.net/lbcyllqj?spm1011.2415.3001.5343哔哩哔哩欢迎关注…

带头节点的单链表的就地逆置

目录 1.题目背景 2.思路方法分析 2.1采用循环实现的就地逆置法 2.2 递归方式实现的逆置 3.金句省身 1.题目背景 本题要求编写函数实现带头结点的单链线性表的就地逆置操作函数。L是一个带头结点的单链表&#xff0c;函数ListReverse_L(LinkList &L)要求在不新开辟节点的…

使用自己的数据集,测试mmrotate新网络rotated_rtmdet,旋转目标检测

1.安装 &#xff01;&#xff01;&#xff01;&#xff01;一定不要安装mmrotate 1.版本需求 mmcv 2.0.0rc2 mmdet 3.0.0rc5 mmengine 0.5.0 不用安装mmcv-full 下载mmrotate 1.x 源码 &#xff08;不要下载默认的master&#xff0c;因为新的网络只在1.x版本中&#xff09; …

【前端】Vue项目:旅游App-(23)detail:房东介绍、热门评论、预定须知组件

文章目录目标过程与代码房东介绍landlord热门评论HotComment预定须知Book效果总代码修改或添加的文件detail.vuedetail-book.vuedetail-hotComment.vuedetail-landlord.vue参考本项目博客总结&#xff1a;【前端】Vue项目&#xff1a;旅游App-博客总结 目标 根据detail页面获…

我用python/C++调用ChatGPT自制了一个聊天问答机器人

目录1 ChatGPT完整版2 Python/C调用ChatGPT2.1 获取API秘钥2.2 测试API功能2.3 设计简单UI3 聊天问答1 ChatGPT完整版 2015年&#xff0c;OpenAI由马斯克、美国创业孵化器Y Combinator总裁阿尔特曼、全球在线支付平台PayPal联合创始人彼得蒂尔等硅谷科技大亨创立&#xff0c;公…

【脚本开发】运维人员必备技能图谱

脚本&#xff08;Script&#xff09;语言是一种动态的、解释性的语言&#xff0c;依据一定的格式编写的可执行文件&#xff0c;又称作宏或批处理文件。脚本语言具有小巧便捷、快速开发的特点&#xff1b;常见的脚本语言有Windows批处理脚本bat、Linux脚本语言shell以及python、…