学习新增/删除过载时,我无法理解一些问题。 问题:重载操作符new(),为什么构造函数被调用两次?
- 为什么在构造函数,析构函数在删除之前调用new?
- 为什么在使用:: new时会调用两次构造函数?
我这里附加代码:
#include<iostream>
using namespace std;
class MyClass
{
public:
MyClass() {
cout << "My Class is Constructed !" << endl;
}
~MyClass() { cout << "My Class is Deleted ! " << endl; }
static void *operator new(size_t Size)
{
cout << "new call" << endl;
MyClass *p = ::new MyClass;
return p;
}
static void operator delete(void *p)
{
cout << "delete call" << endl;
::delete p;
}
};
int main()
{
MyClass *p = new MyClass;
delete p;
cin.get();
return 0;
}
output:
new call
My Class is Constructed !
My Class is Constructed !
My Class is Deleted !
delete call
你不应该在'MyClass :: operator new'里面执行':: new MyClass'。这个函数的目的是在不调用构造函数的情况下分配内存,但是你调用了一个构造函数(这就是为什么你会看到2个构造函数调用 - 对应于'new'表达式的两个用法)。 –
回答你的问题1,显然必须先获得存储空间,然后才能构建对象;并且在释放存储器之前必须销毁对象 –
@ M.M:回答部分如下。 –