new/delete和malloc/free的區別和聯繫

1、malloc和free是C語言標準函數庫中的兩個函數,new/delete是C++語言中兩個運算符。

2、malloc/free和new/delete都是用來申請動態內存的。

3、new 不止是分配內存,而且會調用類的構造函數,同理delete會調用類的析構函數,而malloc則只分配內存,不會進行初始化類成員的工作,同樣free 也不會調用析構函數。

4、malloc得到的指針無類型,new出來的指針是帶有類型信息的。

5、對於非內部數據類型的對象而言,光用maloc/free無法滿足動態對象的要求。對象在創建的同時 要自動執行構造函數,對象在消亡之前要自動執行析構函數。由於malloc/free是庫函數而不是運算符,不在編譯器控制權限之內,不能夠把執行構造函數和析構函數的任務強加於malloc/free

6、如果用free釋放“new創建的動態對象”,那麼該對象因無法執行析構函數而可能導致程序出錯。如 果用delete釋放“malloc申請的動態內存”,理論上講程序不會出錯,但是該程序的可讀性很差。所以new/delete 必須配對使用,malloc/free也一樣。

7、實例如下:

#include <iostream>
#include<malloc.h>

using namespace std;
class Demo
{
public:
      Demo();
      ~Demo();
      void init();
      void drop();
};
Demo::Demo()
{
    cout<<"Demo is made"<<endl;
}
Demo::~Demo()
{
    cout<<"Demo is drop"<<endl;
}

void Demo::init()
{
    cout<<"Demo is made"<<endl;
}
void Demo::drop()
{
    cout<<"Demo is drop"<<endl;
}
void usenew()
{
    Demo *d = new  Demo;
    delete d;
}

void usemalloc()
{
    Demo *d = (Demo*)malloc(sizeof(Demo));
    d->init();
    d->drop();
}
int main()
{
    usenew();
    usemalloc();
    return 0;
}

結果如下:

Demo is made

Demo is drop

Demo is made

Demo is drop

8、如果用free釋放“new創建的動態對象”,那麼該對象因無法執行析構函數而可能導致程序出錯。如 果用delete釋放“malloc申請的動態內存”,理論上講程序不會出錯,但是該程序的可讀性很差。所以new/delete 必須配對使用,malloc/free也一樣。

 

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