| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> C++知识库 -> operator new与placement new -> 正文阅读 |
|
[C++知识库]operator new与placement new |
placement new就是在用户指定的内存位置上构建新的对象,这个构建过程不需要额外分配内存,只需要调用对象的构造函数即可。举例来说: 分配内存这一操作是由operator new(size_t)来完成的,如果类重载了operator new,将调用foo::operator new(size_t ),否则调用全局::operator new(size_t ),后者由C++默认提供。 operator new??operator new是函数,分为三种形式(前2种不调用构造函数,这点区别于new operator):?? 重载operator new:
?输出结果: placement newplacement new是怎么做的呢,把原本new做的两步工作分开来。第一步你自己分配内存,第二步你调用类的构造函数在自己分配的内存上构建新的对象。 placement new的优点: placement new和其他普通的new不同的是,它在括号里多了另外一个参数。比如: Widget * p = new Widget;?//ordinary new? //普通的new pi = new (ptr) int; 括号里的参数是一个指针,它指向一个内存缓冲器,placement new将在这个缓冲器上分配一个对象。Placement new的返回值是这个被构造对象的地址(比如扣号中的传递参数)。placement new主要适用于:在对时间要求非常高的应用程序中,因为这些程序分配的时间是确定的;长时间运行而不被打断的程序;以及执行一个垃圾收集器(garbage collector)。 使用方法在很多情况下,placement new的使用方法和其他普通的new有所不同。这里提供了它的使用步骤。 第一步? 缓存提前分配为了保证通过placement new使用的缓存区的memory alignmen(内存队列)正确准备,使用普通的new来分配它: class Task ; char * buff = new [sizeof(Task)];?//分配内存 (auto或者static内存并非都正确地为每一个对象类型排列,所以不能以placement new使用它们。) 第二步:对象的分配在刚才已分配的缓存区调用placement new来构造一个对象。 Task *ptask = new(buff) Task 第三步:使用按照普通方式使用分配的对象: ptask->suspend(); ptask->resume(); //... 第四步:对象的析构使用完这个对象必须调用它的析构函数来毁灭它。按照下面的方式调用析构函数: ptask->~Task();?//调用外在的析构函数 第五步:内存释放可以反复利用缓存并给它分配一个新的对象(重复步骤2,3,4)如果不打算再次使用这个缓存,可以象这样释放它: delete [] buff; 跳过任何步骤就可能导致运行时间的崩溃,内存泄露,以及其它意想不到的情况。 |
|
C++知识库 最新文章 |
【C++】友元、嵌套类、异常、RTTI、类型转换 |
通讯录的思路与实现(C语言) |
C++PrimerPlus 第七章 函数-C++的编程模块( |
Problem C: 算法9-9~9-12:平衡二叉树的基本 |
MSVC C++ UTF-8编程 |
C++进阶 多态原理 |
简单string类c++实现 |
我的年度总结 |
【C语言】以深厚地基筑伟岸高楼-基础篇(六 |
c语言常见错误合集 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 4:24:04- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |