C++ 中placement new 操作符使用方法
发布时间 - 2026-01-11 01:15:34 点击率:次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
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
百度输入法ai面板怎么关 百度输入法ai面板隐藏技巧
如何快速搭建个人网站并优化SEO?
如何使用 Go 正则表达式精准提取括号内首个纯字母标识符(忽略数字与嵌套)
php做exe能调用系统命令吗_执行cmd指令实现方式【详解】
DeepSeek是免费使用的吗 DeepSeek收费模式与Pro版本功能详解
Android仿QQ列表左滑删除操作
高防网站服务器:DDoS防御与BGP线路的AI智能防护方案
Laravel如何处理表单验证?(Requests代码示例)
Windows10电脑怎么设置虚拟光驱_Win10右键装载ISO镜像文件
无锡营销型网站制作公司,无锡网选车牌流程?
如何在服务器上三步完成建站并提升流量?
Laravel如何生成PDF或Excel文件_Laravel文档导出工具与使用教程
Laravel表单请求验证类怎么用_Laravel Form Request分离验证逻辑教程
详解MySQL数据库的安装与密码配置
Laravel N+1查询问题如何解决_Eloquent预加载(Eager Loading)优化数据库查询
phpredis提高消息队列的实时性方法(推荐)
用v-html解决Vue.js渲染中html标签不被解析的问题
高防服务器租用首荐平台,企业级优惠套餐快速部署
网站制作价目表怎么做,珍爱网婚介费用多少?
如何实现建站之星域名转发设置?
Laravel如何与Vue.js集成_Laravel + Vue前后端分离项目搭建指南
iOS UIView常见属性方法小结
详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)
如何利用DOS批处理实现定时关机操作详解
Windows家庭版如何开启组策略(gpedit.msc)?(安装方法)
如何在IIS中新建站点并解决端口绑定冲突?
厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?
教你用AI润色文章,让你的文字表达更专业
如何生成腾讯云建站专用兑换码?
node.js报错:Cannot find module 'ejs'的解决办法
广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?
详解Nginx + Tomcat 反向代理 如何在高效的在一台服务器部署多个站点
软银砸40亿美元收购DigitalBridge 强化AI资料中心布局
邀请函制作网站有哪些,有没有做年会邀请函的网站啊?在线制作,模板很多的那种?
Android中Textview和图片同行显示(文字超出用省略号,图片自动靠右边)
Win11怎么关闭透明效果_Windows11辅助功能视觉效果设置
如何用免费手机建站系统零基础打造专业网站?
如何用景安虚拟主机手机版绑定域名建站?
中山网站制作网页,中山新生登记系统登记流程?
长沙企业网站制作哪家好,长沙水业集团官方网站?
实例解析Array和String方法
Laravel模型关联查询教程_Laravel Eloquent一对多关联写法
如何在橙子建站中快速调整背景颜色?
Laravel Vite是做什么的_Laravel前端资源打包工具Vite配置与使用
美食网站链接制作教程视频,哪个教做美食的网站比较专业点?
开心动漫网站制作软件下载,十分开心动画为何停播?
如何用腾讯建站主机快速创建免费网站?
免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?
如何快速生成高效建站系统源代码?
西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站?

