C++ new 和 malloc 內部的實現方式的區別

new 和 malloc 內部的實現方式有什麼區別?

new 的功能是在堆區新建一個對象,並返回該對象的指針。

所謂的【新建對象】的意思就是,將調用該類的構造函數,因爲如果不構造的話,就不能稱之爲一個對象。

而 malloc 只是簡單的分配一塊內存,在內存中並沒有對象的概念,如果用 mallco 在堆區創建一個對象的話,是不會調用構造函數的。

嚴格說來用 malloc 不能算是新建了一個對象,只能說是分配了一塊與該類對象匹配的內存而已,然後強行把它解釋爲【這是一個對象】,按這個邏輯來看,也不存在構造函數什麼事。不過我在單片機程序開發時用malloc比較多,c語言面向過程編程沒有對象的概念,所以malloc在c語言中用到的比較多。通常我用來動態申請一塊內存來放鏈表中一個節點的內容 。動態malloc創建,動態free釋放。

同樣的,用 delete 去釋放一個堆區的對象,會調用該對象的析構函數。

用 free 去釋放一個堆區的對象,不會調用該對象的析構函數。

我們通過一個簡單的例子就能明白了:

#include <iostream>
using namespace std;

class Test
{
public:
  Test()
  {
    num1 = 10;
    num2 = 20;
  }

  ~Test()
  {
    cout << "析構函數的調用!" << endl;
  }

  void print()
  {
    cout << num1 << "  " << num2 << endl;
  }

private:
  int num1;
  int num2;

};

void test01()
{
  // 用malloc()函數在堆區分配一塊內存空間,然後用強制類型轉換將該塊內存空間
  // 解釋爲是一個TEST類對象,這不會調用TEST的默認構造函數
  Test * test1 = (Test *)malloc(sizeof(Test));
  test1->print();
  
  free(test1);

  // 用new在堆區創建一個TEST類的對象,這會調用TEST類的默認構造函數
  Test * test2 = new Test;
  test2->print();

  delete[] test2;
}

int main()
{
  test01();

  system("pause");

  return 0;
}

/*
以上代碼中在類的構造函數中給兩個變量賦了初值
分別用malloc和new的方式動態申請空間,之後調用print函數打印兩個變量的值,運行結果:

我們可以看到test1所指的對象中,字段num1與num2都是垃圾值
而test2所指的對象中,字段num1與num2顯然是經過了構造後的值
並且在delete[] test2時還調用了析構函數。
*/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章