學習新增/刪除過載時,我無法理解一些問題。 問題:重載操作符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:回答部分如下。 –