C++ 中placement new 操作符使用方法

placement new操作符能够在分配内存时指定内存位置。下面的程序使用了placement new操作符和常规new操作符给对象分配内存。
// placenew.cpp -- new, placement new, no delete
#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\n";
}
~JustTesting() { cout << words << " destroyed\n"; }
void Show() const { cout << words << ", " << number << endl; }
};
int main(void)
{
char *buffer = new char [BUF]; // get a block of memory
JustTesting *pc1, *pc2;
pc1 = new (buffer)JustTesting; // place object in buffer
pc2 = new JustTesting("heap1", 20); // place object on heap
cout << "Memory block address:\n" << "buffer: "
<< (void *)buffer << " heap: " << pc2 << endl;
cout << "Memory contents: \n";
cout << pc1 << ": ";
pc1->Show();
cout << pc2 << ": ";
pc2->Show();
JustTesting *pc3, *pc4;
pc3 = new (buffer) JustTesting("bad Idea", 6);
pc4 = new JustTesting("Heap2", 10);
cout << "Memory contents: \n";
cout << pc3 << ": ";
pc3->Show();
cout << pc4 << ": ";
pc4->Show();
delete pc2; // free heap1
delete pc4; // free heap2
delete [] buffer; // free buffer
cout << "Done\n";
return 0;
}
执行结果:
[root@localhost 桌面]# ./new Just Testing constructed heap1 constructed Memory block address: buffer: 0x936a008 heap: 0x936a248 Memory contents: 0x936a008: Just Testing, 0 0x936a248: heap1, 20 bad Idea constructed Heap2 constructed Memory contents: 0x936a008: bad Idea, 6 0x936a290: Heap2, 10 heap1 destroyed Heap2 destroyed Done
上面的程序使用placement new操作时存在两个问题。首先,在创建第二个对象时,placement new操作符使用一个新对象来覆盖用于第一个对象的内存单元。显然,如果类动态地为其成员分配内存,这将引发问题。
其次,将delete用于pc2和pc4时,将自动调用为pc2和pc4指向的对象调用析构函数;然而,将delete[]用于buffer时,不会为使用布局new操作符创建的对象调用析构函数。
为确定两个单元不重叠,可以这样做:
pc1 = new (buffer) JustTesting;
pc3 = new (buffer + sizeof(JustTesting)) JustTesting("Better Idea", 6);
其中指针pc3相对于pc1的偏移量为JustTesting对象的大小
第二个教训是,如果使用placement new操作符来为对象分配内存,必须确保其析构函数被调用,但如何确保呢?
例如,在堆中创建的对象,可以这样做:
delete pc2;
然而,对于使用placement new操作符创建的对象,不能像下面一样调用delete
delete pc1; // NO!!!
原因在于delete可与常规new操作符配合使用,但不能与placement new操作符配合使用。
那么我们要显示调用析构函数,必须指定要销毁的对象:
pc3->~JustTesting(); // destroy object pointed to by pc3
int main(void)
{
char *buffer = new char[BUF]; // get a block of memory
JustTesting *pc1, *pc2;
pc1 = new (buffer) JustTesting; // place object in buffer
pc2 = new JustTesting("Heap1", 20); // place object on heap
cout << "Memory block addresses: /n" << "buffer: "
<< (void *)buffer << " heap: " << pc2 << endl;
cout << "Memory contents: ";
cout << pc1 << ": ";
pc1->Show();
cout << pc2 << ": ";
pc2->Show();
JustTesting *pc3, *pc4;
// fix placement new location
pc3 = new (buffer + sizeof(JustTesting)) JustTesting("better Idea", 6);
pc4 = new JustTesting("Heap2", 10);
cout << "Memory contents: ";
cout << pc3 << ": ";
pc3->Show();
cout << pc4 << ": ";
pc4->Show();
delete pc2; // free heap1
delete pc4; // free heap2
// explicitly destroy placement new object
pc3->~JustTesting(); // destroy object pointed to by pc3
pc1->~JustTesting(); // destroy object pointed to by pc1
delete []buffer; // free buffer
cout << "Done/n";
return 0;
}
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
# C++
# 中placement
# new
# 操作符
# placement
# C++使用new操作符动态分配的实现
# C++ new、delete(new[]、delete[])操作符重载需要注意的问题
# C++之CNoTrackObject类和new delete操作符的重载实例
# c++中new和delete操作符用法
# c++中new操作符的具体使用
# 第二个
# 这样做
# 第一个
# 希望能
# 为其
# 谢谢大家
# 相对于
# 但不
# 能与
# 可与
# 这将
# 能像
# 来为
# 量为
# 堆中
# 使用了
# number
# amp
# public
# words
相关文章:
金*站制作公司有哪些,金华教育集团官网?
网站制作公司排行榜,四大门户网站排名?
开心动漫网站制作软件下载,十分开心动画为何停播?
C++用Dijkstra(迪杰斯特拉)算法求最短路径
手机怎么制作网站教程步骤,手机怎么做自己的网页链接?
个人网站制作流程图片大全,个人网站如何注销?
如何用腾讯建站主机快速创建免费网站?
佛山企业网站制作公司有哪些,沟通100网上服务官网?
如何通过NAT技术实现内网高效建站?
网站制作培训多少钱一个月,网站优化seo培训课程有哪些?
建站之星安装提示数据库无法连接如何解决?
零基础网站服务器架设实战:轻量应用与域名解析配置指南
如何挑选高效建站主机与优质域名?
在线流程图制作网站手机版,谁能推荐几个好的CG原画资源网站么?
Java解压缩zip - 解压缩多个文件或文件夹实例
Avalonia如何实现跨窗口通信 Avalonia窗口间数据传递
建站之星伪静态规则如何正确配置?
建站之星微信建站一键生成小程序+多端营销系统
北京建设网站制作公司,北京古代建筑博物馆预约官网?
我的世界制作壁纸网站下载,手机怎么换我的世界壁纸?
文字头像制作网站推荐软件,醒图能自动配文字吗?
网站制作网站,深圳做网站哪家比较好?
如何选择高效可靠的多用户建站源码资源?
广州网站制作的公司,现在专门做网站的公司有没有哪几家是比较好的,性价比高,模板也多的?
小建面朝正北,A点实际方位是否存在偏差?
如何在七牛云存储上搭建网站并设置自定义域名?
广州商城建站系统开发成本与周期如何控制?
如何快速选择适合个人网站的云服务器配置?
制作网站外包平台,自动化接单网站有哪些?
如何快速搭建响应式可视化网站?
如何在宝塔面板中创建新站点?
深圳网站制作的公司有哪些,dido官方网站?
建站之星免费模板:自助建站系统与智能响应式一键生成
如何在Golang中实现微服务服务拆分_Golang微服务拆分与接口管理方法
如何在阿里云虚拟服务器快速搭建网站?
昆明网站制作哪家好,昆明公租房申请网上登录入口?
专业网站制作服务公司,有哪些网站可以免费发布招聘信息?
*服务器网站为何频现安全漏洞?
,怎么在广州志愿者网站注册?
建站之星安装后如何配置SEO及设计样式?
三星网站视频制作教程下载,三星w23网页如何全屏?
网站制作多少钱一个,建一个论坛网站大约需要多少钱?
如何在Golang中使用encoding/gob序列化对象_存储和传输数据
建站之星2.7模板快速切换与批量管理功能操作指南
东莞市网站制作公司有哪些,东莞找工作用什么网站好?
如何注册花生壳免费域名并搭建个人网站?
如何配置IIS站点权限与局域网访问?
c# F# 的 MailboxProcessor 和 C# 的 Actor 模型
已有域名建站全流程解析:网站搭建步骤与建站工具选择
教程网站设计制作软件,怎么创建自己的一个网站?
*请认真填写需求信息,我们会在24小时内与您取得联系。