C++中的布局new操作符

通常,new负责在堆内存中找到一个能够满足要求的内存块。new操作符还有一种变体:placement new 操作符,它能让你指定要使用的内存的位置。 程序员可以使用这种特性来设置其内存管理规程或处理需要通过特定地址进行访问的硬件。
要使placement new,首先需要包含头文件new,下面的代码段演示了new操作符的用法:

#include <new>
#include <iostream>
using namespace std;

struct chaff{
    char a[20];
    int flag;
};

char buffer1[50];
char buffer2[500];

int main(){
    cout<<"Buffer1 at "<<(void*)buffer1<<endl;
    cout<<"Buffer2 at "<<(void*)buffer2<<endl;

chaff *p0,*p1,*p2;
    int *p3,*p4,*p5;

p0=new chaff;
    p3=new int[20];
    cout<<"p0 at "<<p0<<endl;
    cout<<"p3 at "<<p3<<endl;
    delete p0;
    delete [] p3;

p1=new (buffer1) chaff;
    p4=new (buffer2) int [20];
    cout<<"p1 at "<<p1<<endl;
    cout<<"p4 at "<<p4<<endl;

p2=new (buffer1) chaff;
    p5=new (buffer2+100) int [20];
    cout<<"p2 at "<<p2<<endl;
    cout<<"p5 at "<<p5<<endl;

return 0;
}

在上面的代码段中,对p1和p4使用了placement new操作符。这意味着,p1将使用以buffer1为首地址的内存块,而p4将使用以buffer2为首地址的内存块。下面的第二次使用placement new 操作符,p2将使用buffer1为首地址的内存块,而p5将使用buffer2首址+100的内存地址为起始地址的内存块。
程序在我机器上的输出如下:
Buffer1 at 0x437000
Buffer2 at 0x437040
p0 at 0x3d3e68
p3 at 0x3d3e88
p1 at 0x437000
p4 at 0x437040
p2 at 0x437000
p5 at 0x4370a4

当然,你可能会觉得程序有点奇怪。p1和p2都使用了以buffer1为首地址的内存。这样p2会不会将p1覆盖?另外使用placement new操作符的地方没有用delete语句释放内存。这样会不会出问题。答案是:不会。事实上,placement new操作符使用的是静态内存,而不是动态分配的内存。这就意味着,不能用delete操作符来对它进行内存释放。这就跟这样写一样:
int a;
delete a;
这反而会引发运行时错误。而你担心的p2将p1覆盖的问题,事实上并不会存在,但是p1和p2会指向同一块内存!我们可以在上面的程序的最下面加上这样的一段代码:
    strcpy(p2->a,"hello");
    p2->flag=100;

cout<<"p2->a = "<<p2->a<<endl;
    cout<<"p2->flag = "<<p2->flag<<endl;
    cout<<"p1->a = "<<p1->a<<endl;
    cout<<"p1->flag = "<<p1->flag<<endl;

查看这时的输出,你会发现,p1和p2其实是完全一样的!

posted on 2012-04-20 09:05 linyawen 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/linyawen/archive/2012/04/20/2458768.html

C++中的布局new操作符相关推荐

  1. 布局new操作符引发的有关析构函数的探索与总结

    <布局new操作符--不负责分配内存> 布局new操作符能够使我们在分配内存时指定位置. 如下代码交代了相关语法: char *buffer = new char[BUF]; JustTe ...

  2. [WPF] VisualBrush 中的布局

    今天插一篇随笔.说一说上周五遇到的一个布局问题,问题大概是这样的:需要在一个快区域上添加一张透明的背景图片,由于区域较大.并且宽高都不是固定大小,图片较小 所以图片需要居中显示.除此之外还需要在图片的 ...

  3. C++中的指针特征操作符重载

    文章目录 1 C++中的指针特征操作符重载 1.1 指针特征操作符重载 1.2 使用指针特征操作符重载实现智能指针 1 C++中的指针特征操作符重载 1.1 指针特征操作符重载 指针特征操作符重载: ...

  4. Android Studio xml文件中的布局预览视图

    操作系统:Windows 10 x64 IDE:Android Studio 3.3.1 更新了Android Studio之后,xml文件中的布局预览视图变得如此简洁! 原因是没有勾选Show La ...

  5. 【HTML5CSS3进阶学习02】Header的实现·CSS中的布局

    前言 我们在手机上布局一般是这个样子的: 其中头部对整个mobile的设计至关重要,而且坑也很多: ① 一般来说整个header是以fixed布局,fixed这个产物在移动端来说本身坑就非常多 ② 在 ...

  6. DevExpress控件GridControl中的布局详解 【转】

    DevExpress控件GridControl中的布局详解 [转] 2012-10-24 13:27:28|  分类: devexpress |  标签:devexpress  |举报|字号 订阅 h ...

  7. 解析C#中is和as操作符的用法 two

    c# 中 is和as 操作符是用来进行强制类型转换的 is : 检查一个对象是否兼容于其他指定的类型,并返回一个Bool值,永远不会抛出异常  object o = new object();     ...

  8. android如何引用布局,android 动态布局与引用第三方layout中的布局

    引用第三方layout中的布局LinearLayout rightContentView = (LinearLayout) findViewById(R.id.lyt_chat_content); V ...

  9. 【Python】Python中内置的%操作符

    Python中内置的%操作符可用于格式化字符串操作,控制字符串的呈现格式.Python中还有其他的格式化字符串的方式,但%操作符的使用是最方便的. 格式符为真实值预留位置,并控制显示的格式.格式符可以 ...

最新文章

  1. MinkowskiBroadcast广播
  2. 科技公司高管职位知多少?(转)
  3. Oracle 11g AMM与ASMM切换
  4. 她琴棋书画全能,还进入清华计算机系实验室,被赞智商太超群、能力过强悍...
  5. 沈阳大学计算机系教师,张春芳(信息工程学院)老师 - 沈阳大学 - 院校大全
  6. 正则表达式之python3版
  7. python word
  8. 【JS 逆向百例】网洛者反爬练习平台第一题:JS 混淆加密,反 Hook 操作
  9. 一文详解Redis中BigKey、HotKey的发现与处理
  10. 嵌入式Linux系统编程学习之十七计时器与信号
  11. HDU.1000 A + B Problem
  12. 决策树(八)--随机森林及OpenCV源码分析
  13. Java中将16进制字符串转换成汉字
  14. ASP.NET输入文本框自动提示功能
  15. Python12/10--前端之display/overflow使用/清浮动的方式
  16. java自学百度网盘,绝对干货分享
  17. 线和面的方程区别_几种常见的曲面及其方程.ppt
  18. k线形态python_Python量化分析之K线模式识别
  19. 新建的module没有蓝色小块
  20. Win10设置系统补丁更新服务器,win10系统手动更新补丁如何设置 win10系统手动安装更新方法...

热门文章

  1. 光盘中删除数据如何恢复_电脑硬盘数据恢复教程,EasyRecovery软件讲解,恢复删除数据...
  2. db2如何锁定一张表_办公必备的保护工作表技巧,你会了么?
  3. Qt子窗口QMidSubwindow全屏出现的问题总结
  4. [译] iOS 设计模式进阶
  5. SGU 325 Palindrome(贪心)
  6. Oracle变异表解决方法--ORA-04091错误
  7. 起源自天文学的PostgreSQL 优化器成本因子校对
  8. Vue.js 介绍及其脚手架工具搭建
  9. JS switch 分支语句
  10. StateListDrawable 动态更换背景