c中使用malloc出現的問題
- 程序員必須確定對象的長度
- malloc 返回一個
(void *)
指針 ,c++不允許將(void*)
賦值給其它指針,必須強轉 - malloc可能申請內存失敗,所以必須判斷返回值來保存內存分配成功
- 用戶在使用對象之前必須記住對他初始化,構造函數不能顯示調用初始化(構造函數是由編譯器調用的),用戶有可能忘記調用初始化函數
c的動態內存分配函數太復雜,容易令人混淆,是不可接受的,c++中我們推薦使用運算符new和delete
new運算符和delete運算符
-
Person *p=new Person
會返回一個Person -
默認調用析構函數,開辟空間,返回不是
void*
,不需要強制轉換 -
delete釋放
-
new對象用
void *
取接受,釋放不了對象 -
new出來的是數組,如何釋放 ? delete[]
-
new出來的是數組,肯定會調用默認構造
#include<iostream>using namespace std;class Person{public:Person(){cout << "默認構造函數調用" << endl;}Person(int a){cout << "有參構造調用" << endl;}~Person(){cout << "析構函數調用" << endl;}};void test01(){//Person p1; //棧區開辟Person *p2 = new Person;//堆區開辟//所有new出來的對象,都會返回該類型的指針//malloc返回void*還要強轉//malloc會調用構造嗎?不會 new會調用構造//new運算符,malloc是函數//釋放堆區域的空間//delete也是運算符,要配合new用,malloc配合free用delete p2;}void test02(){void *p = new Person;//當用void* 接受new出來的指針,會出現釋放的問題delete p;//無法釋放p}void test03(){//同過new來開辟數組//一定會調用默認構造函數,所以一定要提供默認構造Person *pArray = new Person[10];//Person pArray2[2] = { Person(1), Person(2) };//在棧上開辟數組,可以指定有參構造//釋放數組 delete[]必須加上中括號delete []pArray;}int main(){//test01();//test02();test03();system("pause");return 0;}
malloc/free和new/delete的區別
malloc/free和new/delete的共同點是:都是從堆上申請空間,并且需要用戶手動釋放。不同的地方是:
- malloc和free是函數,new和delete是操作符
- malloc申請的空間不會初始化,new可以初始化
- malloc申請空間時,需要手動計算空間大小并傳遞,new只需在其后跟上空間的類型即可
- malloc的返回值為void*, 在使用時必須強轉,new不需要,因為new后跟的是空間的類型
- malloc申請空間失敗時,返回的是NULL,因此使用時必須判空,new不需要,但是new需要捕獲異常
- 申請自定義類型對象時,malloc/free只會開辟空間,不會調用構造函數與析構函數,而new在申請空間 后會調用構造函數完成對象的初始化,delete在釋放空間前會調用析構函數完成空間中資源的清理
- new/delete比malloc和free的效率稍微低點,因為new/delete的底層封裝了malloc/free