标签:编译器 数组 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