最新C/C++中的new和delete的實現過程小結
下面是《C++ Primer 5th》中P726 對 new 和 delete 過程的解釋:
當我們使用一條new表達式時,實際上執行瞭三步操作:
- new表達式調用一個名為 operator new (或者 operator new[] )的標準庫函數。該函數分配一塊足夠大的、原始的、未命名的內存空間以便存儲特定類型的對象(或者對象數組)。
- 編譯器運行相應的構造函數以構造這些對象,並為其傳入初始值。
- 對象被分配瞭空間並構造完成,返回一個指向該對象的指針。
當我們使用一條delete表達式時,實際上執行瞭兩步操作:
- 對sp所指的對象或者arr所指的數組中的元素執行相應的析構函數。
- 編譯器調用名為 operator delete (或者 **operator delete[] **)的標準庫函數釋放內存空間。
由於不同編譯器對new的實現過程不同,所以我們下面以侯捷老師課件來進行詳解。
new
假設我們現在有一個類:complex.h
#ifndef __MYCOMPLEX__ #define __MYCOMPLEX__ class Complex { public: Complex(double r = 0, double i = 0) :m_real(r), m_imag(i) {} double real() const { return m_real; } double imag() const { return m_real; } private: double m_real; double m_imag; }; #endif
我們new一個對象
Complex* pc = new Complex(1,2);//Complex為類名(復數)
編譯器處理new這一語句的時候,先分配復數的內存,然後進行轉型,最後調用構造函數,進行瞭下面三個過程
void* men= operator new( sizeof(Complex));//第一步,分配內存 pc = static_cast<Complex*>(men);//第二步,轉型 pc->Complex :: Complex(1,2);//第三步,調用構造函數
下面是在VS2019上反匯編得到:
整體示意圖如下:
delete
當我們進行 delete 操作時:
delete pc;
在編譯器的處理過程中,這一語句轉化兩個步驟:先析構再free
Complex::~Complex(pc);//析構函數 operator delete(pc);//釋放內存
下面是在VS2019上反匯編得到:
示意圖如下:
整體代碼如下:
int main() { Complex* pc = new Complex(1, 2); cout << pc->imag() << ":" << pc->real() << endl; delete pc; system("pause"); return 0; }
整體程序運行結果如下:
new[]
假設我們有一個類 MyString.h
#ifndef __MYSTRING__ #define __MYSTRING__ #include <string> class MyString { public: MyString(const char* cstr = 0) { if (cstr) { m_data = new char[strlen(cstr) + 1]; strcpy(m_data, cstr); } else { m_data = new char[1]; *m_data = '\0'; } } ~MyString() { delete[] m_data; } char* get_c_str() const { return m_data; } private: char* m_data; }; #endif
我們new一個對象
MyString* ps = new MyString("Hello");
編譯器處理new這一語句的時候,也是分為三個過程,與上相同
void* men= operator new( sizeof(MyString));//第一步,分配內存 ps = static_cast<MyString*>(men);//第二步,轉型 ps->MyString:: MyString("Hello");//第三步,調用構造函數
下面是在VS2019上反匯編得到:
示意圖如下:
delete[]
當我們進行 delete 操作時:
delete ps;
在編譯器的處理過程中,這一語句轉化兩個步驟:先析構再free
MyString::~MyString(ps);//析構函數 operator delete(ps);//釋放內存
下面是在VS2019上反匯編得到:
示意圖如下:
整體代碼如下:
int main() { MyString* ps = new MyString("Hello"); cout << ps->get_c_str() << endl; delete ps; system("pause"); return 0; }
整體程序運行結果如下:
到此這篇關於C/C++中的new和delete的實現過程的文章就介紹到這瞭,更多相關C++ new和delete內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!