全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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

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 


相关文章: 油猴 教程,油猴搜脚本为什么会网页无法显示?  ,柠檬视频怎样兑换vip?  香港代理服务器配置指南:高匿IP选择、跨境加速与SEO优化技巧  头像制作网站在线制作软件,dw网页背景图像怎么设置?  已有域名和空间如何搭建网站?  宝塔面板创建网站无法访问?如何快速排查修复?  如何用PHP快速搭建高效网站?分步指南  高性能网站服务器配置指南:安全稳定与高效建站核心方案  国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?  网站建设设计制作营销公司南阳,如何策划设计和建设网站?  如何在西部数码注册域名并快速搭建网站?  ,如何利用word制作宣传手册?  建站之星后台搭建步骤解析:模板选择与产品管理实操指南  建站之星云端配置指南:模板选择与SEO优化一键生成  如何通过云梦建站系统实现SEO快速优化?  PHP 500报错的快速解决方法  网站建设制作需要多少钱费用,自己做一个网站要多少钱,模板一般多少钱?  建站之星如何优化SEO以实现高效排名?  详解jQuery中基本的动画方法  如何设计高效校园网站?  实例解析Array和String方法  北京制作网站的公司排名,北京三快科技有限公司是做什么?北京三快科技?  如何通过宝塔面板实现本地网站访问?  如何有效防御Web建站篡改攻击?  网站制作难吗安全吗,做一个网站需要多久时间?  如何在云虚拟主机上快速搭建个人网站?  Android自定义listview布局实现上拉加载下拉刷新功能  企业网站制作公司网页,推荐几家专业的天津网站制作公司?  如何在建站宝盒中设置产品搜索功能?  建站之星如何实现PC+手机+微信网站五合一建站?  香港服务器网站推广:SEO优化与外贸独立站搭建策略  如何挑选最适合建站的高性能VPS主机?  建站主机如何选?高性价比方案全解析  如何通过免费商城建站系统源码自定义网站主题与功能?  大连 网站制作,大连天途有线官网?  如何用虚拟主机快速搭建网站?详细步骤解析  如何高效完成独享虚拟主机建站?  网站制作公司广州有几家,广州尚艺美发学校网站是多少?  学校为何禁止电信移动建设网站?  如何基于云服务器快速搭建个人网站?  建站之星ASP如何实现CMS高效搭建与安全管理?  家庭服务器如何搭建个人网站?  定制建站流程解析:需求评估与SEO优化功能开发指南  如何快速搭建个人网站并优化SEO?  如何确保西部建站助手FTP传输的安全性?  购物网站制作公司有哪些,哪个购物网站比较好?  nginx修改上传文件大小限制的方法  建站之星在线客服如何快速接入解答?  简单实现Android验证码  如何选择PHP开源工具快速搭建网站? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。