- 编译环境
一、new表达式
二、delete表达式
三、代码验证
- 总结
- 参考文献
编译环境
1.gcc 8.1.0
2.Visual Studio Code 1.63.2
book是自定义类型
一、new表达式
当我们使用一个new表达式时,例如: book *ptr = new book(4); 实现执行了以下三步:
- 调用名为operator new 的标准库函数(如果我们自定义了operator new函数,则优先调用我们自己的operator new函数)。
该函数分配一块足够大的、原始的、未命名的内存空间以便存储特定类型的对象。
- 编译器运行相应的构造函数,例如book类的构造函数,以构造这些对象,并为其传入初始值。
- 对象被分配了空间并构造完成,返回一个指向该对象的指针,例如book*。
二、delete表达式
当我们使用一个delete表达式时,例如:delete ptr; 实现执行了以下两步:
- 对ptr所指的对象执行对应的析构函数。
- 编译器调用名为operator delete的标准库函数(如果我们自定义了operator delete函数,则优先调用我们自己的operator delete函数)释放内存空间。
三、代码验证
为了验证这一工作机理,我们自定义了book类,operator new和operator delete函数,并使其输出相应的语句,C++代码如下:
#include
#include
#include
using namespace std;
//自定义operator new
void *operator new(size_t size)
{
if (void *mem = malloc(size))
{
cout << "operator new" << endl;
return mem;
}
else
throw bad_alloc();
}
//自定义operator delete
void operator delete(void *mem, size_t sz)
{
cout << "operator delete" << endl;
free(mem);
}
//自定义类型book
class book{
public:
book(int No = 0):bookNo(No){
cout << "book constructor" << endl;
}
~book(){
cout << "book destructor" << endl;
}
private:
int bookNo;
};
int main(){
book *ptr = new book(4);
delete ptr;
return 0;
}
代码输出如下:
operator new
book constructor
book destructor
operator delete
总结
new表达式工作机理:
1.调用operator new函数,2.调用构造函数构造对象,3.返回指向该对象的指针。
delete表达式工作机理:
1.调用析构函数,2.调用operator delete函数。
C++ Primer (第5版)中文版, Stanley B.Lippman,Josee Lajoie, Barbara E.Moo.
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)