码迷,mamicode.com
首页 > 编程语言 > 详细

【c++ primer】【19.1.1】重载new和delete

时间:2019-08-31 17:03:17      阅读:79      评论:0      收藏:0      [点我收藏+]

标签:编译器   数组   div   过程   value   释放   程序   动态分配   应用程序   

  尽管我们能说“重载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++ primer】【19.1.1】重载new和delete

标签:编译器   数组   div   过程   value   释放   程序   动态分配   应用程序   

原文地址:https://www.cnblogs.com/bootblack/p/11439521.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!