c++ primer19.1.1重载new和delete

Posted bootblack

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c++ primer19.1.1重载new和delete相关的知识,希望对你有一定的参考价值。

  尽管我们能说“重载new和delete”,但是实际上重载这两个运算符和重载其它运算符的过程大不相同。要想真正掌握重载new和delete的方法,首先需要对new表达式和delete表达式的工作机理有更多了解。

  当我们使用new表达式时:

//new表达式
string *sp = new string("a value"); //分配并初始化一个string对象
string *arr = new string[10];       //分配10个默认初始化的string对象

实际上执行了三个操作。第一步,new表达式调用了为operator new(或者operator[] new)的标准库函数。该函数分配一个足够大的、原始的、未命名的内存空间以便存储特定类型的对象(或者对象的数组)。第二步,编译器运行相应的构造函数以构造这些对象,并为其传入初始值。第三步,对象被分配了空间并构造完成,返回一个指向该对象的指针。

  当我们使用一条delete表达式删除一个动态分配的对象时:

delete sp;      //销毁*sp,然后释放sp指向的内存空间
delete [] arr;  //销毁数组中的元素,然后释放对应的内存空间

实际上执行了两个步骤。第一步,对sp所指的对象或者arr所指的数组中的元素执行对应的析构函数。第二步,编译器调用名为operator delete(或者operator delete[])的标准库函数释放内存空间。

  如果应用程序希望控制内存分配的过程,则它需要定义自己的operator new函数和oprator delete函数。即使在标准库中已经存在这两个函数的定义,我们仍旧可以定义自己的版本。编译器不会对这种重读定义提出异议,相反,编译器将使用我们自定义的版本替换标准库定义的版本。

以上是关于c++ primer19.1.1重载new和delete的主要内容,如果未能解决你的问题,请参考以下文章

C++ Primer笔记17---chapter14 重载运算与类型转换

C++ Primer 5th笔记(chap 16 模板和泛型编程)重载与模板

C++ Primer 5th笔记(chap 16 模板和泛型编程)重载模板和类型转换

C++ Primer Plus学习:第十一章

C++ Primer 0x0E 学习笔记

C++ Primer 0x0E 学习笔记