定位new(placement new)

By | 11月13日
Advertisement

new运算符竟然还可以这样用,只初始化一个对象,而不分配内存,如下所示:

using namespace std;
#include <iostream>

int main(int argc, char *argv[])
{
    char str[10] = { '1', '2', '3', '4', '5', '6', '7', '8', '9', 0 };
    int *p = new (str) int;
    cout << hex << *p << endl;

    for (int i = 0; i < sizeof(str); i++)
    {
        cout << str[i] << " ";
    }
    cout << endl;

    p = new (str) int(0);
    cout << hex << *p << endl;

    for (int i = 0; i < sizeof(str); i++)
    {
        cout << str[i] << " ";
    }
    cout << endl;

    return 0;
}

使用placement new时,地址一定要加括号,否则编译不过去。int *p = new (str) int;是指在str的地址上分配一个int型数据,此时没有初始化,p = new (str) int(0);是指在str的地址分配一个int型数据并且初始化为0。
该程序的运行结果如下:

34333231
1 2 3 4 5 6 7 8 9
0
    5 6 7 8 9

第一次分配,没有改变原str数组的值,打印出来的仍然是字符’1’-‘9’,第二次,数组的前4个元素被清成了0。

Similar Posts:

  • c++动态内存开辟之 new 的三种形态

    1.new 操作符 与 操作符 new //new new操作符 //delete delete操作符 //operator new 操作符new //operator delete 操作符delete void main() { Date *p_date = (Date *)operator new (sizeof (Date)); //只是开辟空间 new (p_date)Date (1, 1, 1); //定位 new p_date->~Date(); //析构函数的显示调用 operat

  • C++ Common Knowledge(c++必知必会) Notes(二)

    本篇文章是继续第一篇笔记的续. 17.Factory Method模式 一个高级设计通常要求基于一个现有对象类型来创建一个"适当"类型的对象.例如,我们可能拥有一个指向某种类型的Employee对象的指针或引用,现在需要为该类型的Employee生成一个适当的HRInfo对象,如图: 一般情况下我们会采用一下两种不好的方式: 使用一个"类型编码"和switch class Employee { public: enum Type{SALARY,HOURLY,TEMP

  • 《Exceptional C++ Style》笔记.txt

    1.std::vector有两种访问其元素的途径:at和[].at提供下标越界检查,若越界抛出std::out_of_range异常; operetor[]和内置数组一样没有越界检查但效率较高. 2.如果可能的话,使用const_iteraror: 用!=比较迭代器而不是<: 使用前缀--或++: 尽量用n而不是endl; 尽量复用标准算法,如使用copy和for_each()代替手写循环. 3.sprintf:优点:符合标准.易用.高效没有额外内存分配: 缺点:长度不安全.类型不安全.不能在模

  • C++中placement new和delete讨论

    作者:华清远见讲师 在程序设计中频繁地进行动态内存分配和释放容易造成内存碎片,给需要长期稳定运行的系统带来了隐患.尽管现代操作系统在内存管理的稳健性上已经有了较大提高,但是动态内存分配的效率.稳定性等问题仍然是一个困扰.所以在需要长期稳定运行的.生命攸关的嵌入式设备程序开发中通常都要避免过多地使用new和delete,甚至禁止使用C++的标准库,因为其中经常进行动态内存的分配与释放.然而要充分享用使用C++带来的便利之处,动态地创建和销毁对象的能力还是非常有必要的. 本文引用地址:http://

  • WebDriver的几种定位方式介绍

    通过ID查找元素 通过页面元素的ID来查找元素是最为推荐的方式.W3C标准推荐开发人员为每一个页面元素都提供一个独一无二的ID元素,因此开发人员应避免单个页面上的所有元素存在ID不唯一的情况和元素ID是自动生成的情况. 页面元素的ID被作为首选的识别属性,因为这是最快的识别策略. driver.findElement(By.id("Title")).sendKeys("test content");//如果需要,可用WebElement先存储起来, 然后再进行相应操

  • 蓝牙Ibeacon室内定位和微信摇一摇周边原理分析

    苹果推出Ibeacon室内定位技术是为了弥补GPS无法覆盖室内定位这种场景.苹果意味着创新,在其推动下,蓝牙Ibeacon得到了极大的应用.而腾讯则是利用蓝牙Ibeacon在场景体验方面进行了创新,实现了微信摇一摇周边的功能,这在O2O领域有巨大的潜力. 对苹果和腾讯来说,Ibeacon都是应用创新,而不是技术创新. 本文分析Ibeacon室内定位和微信摇一摇的原理. 一.无线测距原理 无线信号都有一个信号强度(RSSI),蓝牙BLE自然也有.根据蓝牙BLE自身的发射功率(假设能够获取这个功率值

  • (高德地图)marker定位 bug 解决总结

    项目背景: 一个项目bug,项目中用到高德地图,默认打开页面会生成一个marker(下图红色icon),然后用户拖动marker到想要的位置,并且保存. 用户反映定位不准确,在当前页面编辑的位置,到后台打开位置就会有偏移. 因为后台打开时候是根据经纬度生成的marker,经过检查最终确定是前台页面,拖动marker定位 获取经纬度 那里出的问题. 这里不得不说下个人情况,此项目是他人开发,而开发人员已经不在公司,bug转发给我了.自己之前也没怎么使用过高德,主要使用的是谷歌地图和mapbox.

  • 利用php-fpm的慢日志定位故障

    利用php-fpm的慢日志定位故障 今天上午,开发小哥向我反映一台开发机访问时速度非常慢,让我帮他找一下原因,然后我就开始了一个排错的过程,当时我的思路是这样的:判断网络是否有问题,判断开发机资源是否耗尽,判断各服务是否正常运行,判断代码问题. 网络问题较为简单了,ping一下,traceroute一下,发现没有问题,网络很正常.排除了网络问题以后就要判断是否是服务器资源耗尽了,然后我ssh登陆到开发机上,使用top命令,看到的结果如下: 从这个结果来看,服务器资源还是很富裕的,问题不在这里.那

  • css-div定位详解

    网上也有不少使用div + css进行布局的教程,却存在很多缺陷,一是对css的布局模型讲解不清楚,让人很难理解相对定位.浮动等概念:二是虽然避免了"表格套表格"的缺点,却带来了"div 套 div"的缺点,过量使用div标签:三是class过多,造成class灾难. 要正确使用css,对css的基本只是就不能够不了解.既然是漫谈,我这里就只讲四个方面,最后给出xkland项目作为实例. 一.CSS中的块模型 在CSS的定义中,有的html标签被浏览器当成一个块来显

  • IOS LocationManager定位国内偏移,火星坐标(GCJ-02)解决方法

    转载自:http://blog.csdn.net/swingpyzf/article/details/16972351 纠偏也可参考:http://www.2cto.com/kf/201310/253833.html IOS7 WGS-84转GCJ-02(火星坐标) CLLocationManager类可以实时的获得我们位置的经纬度,并且可以通过经纬度在MapView上定位: [objc] view plain copy print? //创建CLLocationManager对象 CLLoca

Tags: