这里说的定位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. ARMV7-M数据手册---Part A :Application Level Architecture---A1 Introduction

    1.前言 本章主要介绍了ARMV7体系结构及其定义的属性,以及本手册定义的ARMV7M属性. 主要包括: ARMV7体系结构和属性 ARMV7M属性 ARMV7M扩展 2. ARMV7体系结构和属性 ...

  2. dubbo源码分析6——SPI机制中的AOP

    在 ExtensionLoader 类的loadFile方法中有下图的这段代码: 类如现在这个ExtensionLoader中的type 是Protocol.class,也就是SPI接口的实现类中Xx ...

  3. Kafka管理工具介绍【转】

    Kafka内部提供了许多管理脚本,这些脚本都放在$KAFKA_HOME/bin目录下,而这些类的实现都是放在源码的kafka/core/src/main/scala/kafka/tools/路径下. ...

  4. DUILIB入门简明教程

      电子书下载: DUILIB入门简明教程.chm 文章作者:  Alberl 电子书制作: 邓学彬 目录: 2013 duilib入门简明教程 -- 前言(1) 2013 duilib入门简明教程 ...

  5. VS2017中VC++项目添加StringTable资源

    1.在资源视图中选择Resource.rc,右键弹出菜单,选择[添加资源] 2.在[添加菜单]对话框中选择[String Table],新建即可

  6. Python学习前期准备---第九天

    一.Linux基础 - 计算机以及日后我们开发的程序防止的服务器的简单操作 二.Python开发 http://www.cnblogs.com/wupeiqi/articles/5433893.htm ...

  7. zabbix3.0.4使用percona-monitoring-plugins插件来监控mysql5.6的详细实现过程

    zabbix3.0.4使用percona-monitoring-plugins插件来监控mysql5.6的详细实现过程 因为Zabbix自带的MySQL监控没有提供可以直接使用的Key,所以一般不采用 ...

  8. 清北学堂 清北-Day1-R2-监听monitor

    题目描述 [背景] 不阅读本题的[背景]并不影响通过本题. 三体信息中没有包含对三体⼈⽣物形态的任何描述,⼈类要在四百多年以后才能真正看到三体⼈.在阅读信息时,叶⽂洁只能把三体⼈想象成⼈类的形象. 1 ...

  9. textarea的高度随内容变化而变化

    <li class="text"> <span>参赛宣言*</span> <textarea name="txt" i ...

  10. maven install 报错 No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK?

    1.控制台打印信息 [INFO] Scanning for projects... [INFO] [INFO] ---------------------< org.cqupt.mauger:R ...