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時還調用了析構函數。
*/