这里说的定位new运算符,是一种相对于普通的new运算符,可以指定内存地址的运算符,程序直接使用我们提供的地址,不管它是否已经被使用,而且可以看到新值直接覆盖在旧值上面。

定位new运算符直接使用传递给它的地址,它不负责判断哪些内存单元已被使用,也不查找未使用的内存块

由于本质上定位new运算符并不开辟新的内存,也就不应该用delete去释放它

单来说就是new运算符只是返回传递给它的地址,并将其强制转换为void *,以便能够赋给任何指针类型。

#include<iostream>
#include<string> using namespace std; const int BUF = ; class JustTesting
{
private:
string words;
int number;
public:
JustTesting(const string& s = "Just Testing", int n = )
{
words = s;
number = n;
cout << words << " constructed" << endl;
}
~JustTesting()
{
cout << words << " destroyed" << endl;
}
void show() const
{
cout << words << " ," << number << endl;
}
}; int main()
{
char* buffer = new char[BUF];
JustTesting *pc1, *pc2;
pc1 = new(buffer)JustTesting;
pc2 = new JustTesting("Heap1", );
cout << "Memory block address" << endl << "buffer: " << (void*)buffer << " heap: " << pc2 << endl;
cout << pc1 << ": ";
pc1->show();
cout << pc2 << ": ";
pc2->show(); JustTesting *pc3, *pc4;
//pc3 = new (buffer)JustTesting("Bad Idea", 6); //pc3直接占用了pc1的内存区域,这样一来如果pc1中有new分配的成员变量,将造成内存泄漏,
//因此更好的方式是
pc3 = new (buffer+sizeof(JustTesting)) JustTesting("Better Idea",);
pc4 = new JustTesting("Heap2", ); cout << "Memory Contents" << endl;
cout << pc3 << ": ";
pc3->show();
cout << pc4 << ": ";
pc4->show(); delete pc2;
delete pc4;
//由于delete buffer并不会出发buffer内对象的析构函数,所以只能手动调用其析构函数
//需要注意调用析构函数的顺序,由于晚创建的对象可能依赖早创建的对象,因此析构的顺序应该与创建顺序相反,另外,仅当析构了所有对象之后,才能释放用于存储这些对象的缓冲区
pc3->~JustTesting();
pc1->~JustTesting();
delete[] buffer;
//delete pc1; 因为buffer和pc1实际上指向同一个地址,因此如果注释掉上面一行,打开这里,也可以正常运行,但逻辑上却是没有道理的
cout << "done" << endl;
cin.get();
return ;
}

C++ 定位new运算符的更多相关文章

  1. C++ new 运算符 用法总结

    C++ new 运算符 用法总结 使用 new 运算符 分配内存 并 初始化 1.分配内存初始化标量类型(如 int 或 double),在类型名后加初始值,并用小括号括起,C++11中也支持大括号. ...

  2. C++学习笔记(3)

    本学习笔记是C++ primer plus(第六版)学习笔记.是C++学习笔记(2)的后续.复习C++基础知识的可以瞄瞄. 转载请注明出处http://www.cnblogs.com/zrtqsk/p ...

  3. C++ Primer Plus读书笔记

    第五章 循环和关系表达式 1. 2.类别别名: (1)   #define FLOAT_POINTER float * FLOAT_POINTER pa, pb; 预处理器置换将该声明转换成  flo ...

  4. C++——类和动态内存分配

    一.动态内存和类 1.静态类成员 (1)静态类成员的特点 无论创建多少对象,程序都只创建一个静态类变量副本.也就是说,类的所有对象都共享同一个静态成员. (2)初始化静态成员变量 1)不能在类声明中初 ...

  5. STL—对象的构造与析构

    STL内存空间的配置/释放与对象内容的构造/析构,是分开进行的.   对象的构造.析构         对象的构造由construct函数完成,该函数内部调用定位new运算符,在指定的内存位置构造对象 ...

  6. [C++ Primer Plus] 第9章、内存模型和名称空间(二)课后习题

    一.复习题 2.using声明和using编译指令的区别 using声明: using std::cin; using std::cout; using std::endl; using编译指令:us ...

  7. [C++ Primer Plus] 第9章、内存模型和名称空间(一)程序清单

    程序清单9.9(静态存储连续性.无链接性) #include<iostream> using namespace std; ; void strcount(const char *str) ...

  8. C++ Primer Plus (Stephen Prata 著)

    第1章 预备知识 (已看) 第2章 开始学习C++ (已看) 第3章 处理数据 (已看) 第4章 复合类型 (已看) 第5章 循环和关系表达式 (已看) 第6章 分支语句和逻辑运算符 (已看) 第7章 ...

  9. 再读c++primer plus 004

    第九章  内存模型和名称空间 1.如果文件名包含在尖括号中,则c++编译器将在存储标准头文件的主机系统的文件系统中查找,但如果文件名包含在双引号中,则编译器将首先查找当前的工作目录或源代码目录(或其他 ...

随机推荐

  1. k64 datasheet学习笔记35---Analog-to-Digital Converter (ADC)

    0.前言 本文主要介绍K64的ADC部分的特性,内部架构,信号描述及操作接口等 1.简介 1.1.ADC模块特性 线性逐次逼近算法,达16bit分辨率 达到4对差分和24个单端模拟量输入 输出模式 差 ...

  2. CentOS(Linux)中解决MySQL乱码

    环境:CentOS 6.3.mysql5.1 Centos 6.3在上安装mysql client和server之后,出现乱码,不得不修改编码. 注意: 关于utf8和gbk的区别详细见:linux中 ...

  3. Windows下return,exit和ExitProcess的区别和分析

    通常,我们为了使自己的程序结束,会在主函数中使用return或调用exit().在windows下还有ExitProcess()和TerminateProcess()等函数. 本文的目的是比较以上几种 ...

  4. 专题2:最长上升子序列LIS

        A HDU 1025 Constructing Roads In JGShining's Kingdom     B POJ 3903 Stock Exchange     C OpenJ_B ...

  5. tomcat和springboot访问日志及分析

    1.Tomcat设置访问日志 <Host name="localhost" appBase="webapps" unpackWARs="true ...

  6. jmeter设置全局变量

    2017年4月20日 10:07:37 星期四 情景, 从第一个请求的结果中匹配出code, 当作参数去做下次请求 以抢红包为例: 1. 创建红包, 并从返回结果中获取红包code 2. 将code设 ...

  7. 二、消息队列之如何在C#中使用RabbitMQ

    1.什么是RabbitMQ.详见 http://www.rabbitmq.com/. 作用就是提高系统的并发性,将一些不需要及时响应客户端且占用较多资源的操作,放入队列,再由另外一个线程,去异步处理这 ...

  8. Day8--------------ssh服务

    ---恢复内容开始--- 远程管理 ssh服务端 oppenssh-server ssh客户端 oppenssh-clients Xshell 开启服务端 service sshd status 点击 ...

  9. mysql 中实现多条数据同时更新

    有时间我们需要对一张表进行批量数据的更新.首先我们想的是update 语句. 比如对一张订单表order_info 多条数据更新, update order_inifo set   order_cod ...

  10. js调用ajax案例

    js调用ajax案例 测试地址:http://www.w3school.com.cn/tiy/t.asp?f=ajax_get 嵌入下面代码,点击提交,再点击请求数据.就可以看到结果了. <ht ...