C++中malloc/free和new/delete的區別---補充(15)《Effective C++》
1、C++中既然有了new/delete為什麼還有還存在malloc/free呢?
1)malloc/free作為C/C++語言中的庫函式,而new/delete是C++中的運算子而已,因此C++編譯器可以強制使new/delete運算子進行建構函式和解構函式的執行,而針對庫函式,C++編譯器則沒有那麼高的許可權;
2)new/delete中需要呼叫C語言中的一些函式,而在C語言中只可以使用malloc和free進行記憶體空間的申請與釋放,因此,我們需要在C++中保留malloc/free函式。
2、malloc/free函式和new/delete運算子需要什麼解析方式呢?
1、malloc/free
#include <iostream>
#include <cstdlib>
using namespace std;
class Base1{
public:
int i;
int *l;
Base1(){
this->i = 10;
l = &i;
}
void setArgs(int i){
this->i = i;
l = &this->i;
}
Base1(int i) :i(i=10){
}
friend ostream& operator <<(ostream& os, Base1& base1){
os << base1.i << endl;
os << base1.l << endl;
return os;
}
void show(){
cout << "Base1:" << this->i << endl;
}
~Base1(){
cout << "Base1析構開始。。。" << endl;
delete l;
}
};
int main(){
Base1* base = (Base1*)malloc(sizeof(Base1));
base->setArgs(100);
free(base);
if (base == NULL){
cout << "指標為空" << endl;
}
else{
cout << "base指標的地址:" << base << endl;
cout << "執行free()之後繼續訪問該記憶體空間:" << endl;
cout << *base << endl;
}
/*Base1* base1 = new Base1(10);
base1->show();
delete base1;
return 0;*/
}
執行結果:
除錯過程:
1)下面我們通過除錯這段程式碼瞭解malloc/free函式的執行機制。
2)執行free(base)之後的空間:
我們驚喜的發現,在執行free()函式後,仍舊可以通過指標訪問原記憶體空間,所以我們認為free()操作的釋放記憶體空間的解釋:只是裡面的值都被銷燬掉而已,但裡面的記憶體結構不會受到損傷,然而內部的記憶體結構卻都完好著無損,因此,編譯器隨機為這些變數進行隨機賦值操作,所以就導致仍舊可以通過原指標訪問一段已經被我們捨棄的記憶體空間,可以通過原指標操縱這段記憶體空間,因此可能造成記憶體洩露的問題。
2、new/delete
#include <iostream>
#include <cstdlib>
using namespace std;
class Base1{
public:
int i;
int *l;
Base1(){
this->i = 10;
l = &i;
}
void setArgs(int i){
this->i = i;
l = &this->i;
}
Base1(int i) :i(i=10){
}
friend ostream& operator<<(ostream& os, Base1& base1){
os << base1.i << endl;
os << base1.l << endl;
return os;
}
void show(){
cout << "Base1:" << this->i << endl;
}
~Base1(){
cout << "Base1析構開始。。。" << endl;
delete l;
}
};
int main(){
/*Base1* base = (Base1*)malloc(sizeof(Base1));
base->setArgs(100);
free(base);
if (base == NULL){
cout << "指標為空" << endl;
}
else{
cout << "base指標的地址:" << base << endl;
cout << "執行free()之後繼續訪問該記憶體空間:" << endl;
cout << *base << endl;
}*/
Base1* base1 = new Base1(10);
base1->show();
delete base1;
return 0;
}
執行結果:
除錯動作:
- 執行完new動作之後的記憶體狀況:
- 執行完delete動作之後的記憶體狀況:
3、malloc/free函式和new/delete的標準區別:
malloc和free只是從記憶體空間中申請記憶體和釋放記憶體而已,而new/delete不僅從記憶體空間中申請釋放記憶體,同時還會執行物件的建構函式和解構函式,即new在申請記憶體後執行物件建立動作,delete在釋放記憶體的同時還會執行物件的清理動作,更加完善了,不是嗎?
簡單區別malloc/free和new/delete機制:
- malloc和new的區別:
malloc只是簡單的建立空間,就像剛買了自己心愛的房屋而已,然後沒有任何操作;new呢?則是在買房間的同時就已經將裡面裝修了,並放了你喜歡的傢俱進去啦!!!是不是很人性化呀!
- free和delete的區別:
free只是簡單的將把房間中的東西都銷燬掉而已,原來的房屋結構不會受到任何影響,即原來是三室一廳,在你搬出房屋後還是三室一廳,程式結束時候這段空間被釋放,可以理解為房屋過了80年或者更久需要統一拆遷,然後被拆,但是在這段時間內,有人可能拿著房間的鑰匙進入房間甚至將自己的東西放進去,然而你並不知道,這對你來說是不允許的吧!對程式來說就是可能造成記憶體洩漏啦!
delete呢?則是在你將房間中的東西銷燬掉的同時房子也一起拆了,比較乾淨,這樣就不會有人可以住進去啦!
PS:
建議:希望大家在C++中針對自定義型別時候一定請使用new/delete運算子動作,避免出現記憶體洩漏等嚴重問題。。。