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
相关文章:
网站制作模板下载什么软件,ppt模板免费下载网站?
在线教育网站制作平台,山西立德教育官网?
如何在IIS7上新建站点并设置安全权限?
建站之星Pro快速搭建教程:模板选择与功能配置指南
如何在IIS中新建站点并配置端口与物理路径?
如何用虚拟主机快速搭建网站?详细步骤解析
专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?
建站之星如何取消后台验证码生成?
如何快速生成高效建站系统源代码?
北京制作网站的公司,北京铁路集团官方网站?
网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?
专业制作网站的公司哪家好,建立一个公司网站的费用.有哪些部分,分别要多少钱?
网站制作价目表怎么做,珍爱网婚介费用多少?
专业网站制作企业网站,如何制作一个企业网站,建设网站的基本步骤有哪些?
定制建站流程解析:需求评估与SEO优化功能开发指南
建站之星安装步骤有哪些常见问题?
宝塔新建站点为何无法访问?如何排查?
宝塔建站教程:一键部署配置流程与SEO优化实战指南
如何通过宝塔面板实现本地网站访问?
公司网站的制作公司,企业网站制作基本流程有哪些?
宝塔Windows建站如何避免显示默认IIS页面?
如何快速生成可下载的建站源码工具?
C++时间戳转换成日期时间的步骤和示例代码
孙琪峥织梦建站教程如何优化数据库安全?
网站制作专业公司有哪些,如何制作一个企业网站,建设网站的基本步骤有哪些?
黑客入侵网站服务器的常见手法有哪些?
沈阳制作网站公司排名,沈阳装饰协会官方网站?
沈阳个人网站制作公司,哪个网站能考到沈阳事业编招聘的信息?
如何高效配置香港服务器实现快速建站?
如何在橙子建站中快速调整背景颜色?
如何用搬瓦工VPS快速搭建个人网站?
简单实现Android验证码
北京的网站制作公司有哪些,哪个视频网站最好?
如何在万网开始建站?分步指南解析
儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?
建站之星后台搭建步骤解析:模板选择与产品管理实操指南
香港服务器租用费用高吗?如何避免常见误区?
英语简历制作免费网站推荐,如何将简历翻译成英文?
营销式网站制作方案,销售哪个网站招聘效果最好?
如何在阿里云通过域名搭建网站?
网站制作的步骤包括,正确网址格式怎么写?
常州自助建站费用包含哪些项目?
网站规划与制作是什么,电子商务网站系统规划的内容及步骤是什么?
金*站制作公司有哪些,金华教育集团官网?
免费网站制作appp,免费制作app哪个平台好?
智能起名网站制作软件有哪些,制作logo的软件?
平台云上自主建站:模板化设计与智能工具打造高效网站
建站主机服务器选型指南与性能优化方案解析
如何在阿里云ECS服务器部署织梦CMS网站?
网站设计制作公司地址,网站建设比较好的公司都有哪些?
*请认真填写需求信息,我们会在24小时内与您取得联系。