最新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!

推薦閱讀: