日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > c/c++ >内容正文

c/c++

c++中new的总结(动态管理,malloc存在的问题,malloc与new的区别)

發(fā)布時(shí)間:2023/11/30 c/c++ 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c++中new的总结(动态管理,malloc存在的问题,malloc与new的区别) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

c中使用malloc出現(xiàn)的問(wèn)題

  • 程序員必須確定對(duì)象的長(zhǎng)度
  • malloc 返回一個(gè)(void *)指針 ,c++不允許將(void*) 賦值給其它指針,必須強(qiáng)轉(zhuǎn)
  • malloc可能申請(qǐng)內(nèi)存失敗,所以必須判斷返回值來(lái)保存內(nèi)存分配成功
  • 用戶在使用對(duì)象之前必須記住對(duì)他初始化,構(gòu)造函數(shù)不能顯示調(diào)用初始化(構(gòu)造函數(shù)是由編譯器調(diào)用的),用戶有可能忘記調(diào)用初始化函數(shù)
  • c的動(dòng)態(tài)內(nèi)存分配函數(shù)太復(fù)雜,容易令人混淆,是不可接受的,c++中我們推薦使用運(yùn)算符new和delete

    new運(yùn)算符和delete運(yùn)算符

  • Person *p=new Person會(huì)返回一個(gè)Person

  • 默認(rèn)調(diào)用析構(gòu)函數(shù),開(kāi)辟空間,返回不是void*,不需要強(qiáng)制轉(zhuǎn)換

  • delete釋放

  • new對(duì)象用void *取接受,釋放不了對(duì)象

  • new出來(lái)的是數(shù)組,如何釋放 ? delete[]

  • new出來(lái)的是數(shù)組,肯定會(huì)調(diào)用默認(rèn)構(gòu)造

    #include<iostream>using namespace std;class Person{public:Person(){cout << "默認(rèn)構(gòu)造函數(shù)調(diào)用" << endl;}Person(int a){cout << "有參構(gòu)造調(diào)用" << endl;}~Person(){cout << "析構(gòu)函數(shù)調(diào)用" << endl;}};void test01(){//Person p1; //棧區(qū)開(kāi)辟Person *p2 = new Person;//堆區(qū)開(kāi)辟//所有new出來(lái)的對(duì)象,都會(huì)返回該類型的指針//malloc返回void*還要強(qiáng)轉(zhuǎn)//malloc會(huì)調(diào)用構(gòu)造嗎?不會(huì) new會(huì)調(diào)用構(gòu)造//new運(yùn)算符,malloc是函數(shù)//釋放堆區(qū)域的空間//delete也是運(yùn)算符,要配合new用,malloc配合free用delete p2;}void test02(){void *p = new Person;//當(dāng)用void* 接受new出來(lái)的指針,會(huì)出現(xiàn)釋放的問(wèn)題delete p;//無(wú)法釋放p}void test03(){//同過(guò)new來(lái)開(kāi)辟數(shù)組//一定會(huì)調(diào)用默認(rèn)構(gòu)造函數(shù),所以一定要提供默認(rèn)構(gòu)造Person *pArray = new Person[10];//Person pArray2[2] = { Person(1), Person(2) };//在棧上開(kāi)辟數(shù)組,可以指定有參構(gòu)造//釋放數(shù)組 delete[]必須加上中括號(hào)delete []pArray;}int main(){//test01();//test02();test03();system("pause");return 0;}
  • malloc/free和new/delete的區(qū)別

    malloc/free和new/delete的共同點(diǎn)是:都是從堆上申請(qǐng)空間,并且需要用戶手動(dòng)釋放。不同的地方是:

  • malloc和free是函數(shù),new和delete是操作符
  • malloc申請(qǐng)的空間不會(huì)初始化,new可以初始化
  • malloc申請(qǐng)空間時(shí),需要手動(dòng)計(jì)算空間大小并傳遞,new只需在其后跟上空間的類型即可
  • malloc的返回值為void*, 在使用時(shí)必須強(qiáng)轉(zhuǎn),new不需要,因?yàn)閚ew后跟的是空間的類型
  • malloc申請(qǐng)空間失敗時(shí),返回的是NULL,因此使用時(shí)必須判空,new不需要,但是new需要捕獲異常
  • 申請(qǐng)自定義類型對(duì)象時(shí),malloc/free只會(huì)開(kāi)辟空間,不會(huì)調(diào)用構(gòu)造函數(shù)與析構(gòu)函數(shù),而new在申請(qǐng)空間 后會(huì)調(diào)用構(gòu)造函數(shù)完成對(duì)象的初始化,delete在釋放空間前會(huì)調(diào)用析構(gòu)函數(shù)完成空間中資源的清理
  • new/delete比malloc和free的效率稍微低點(diǎn),因?yàn)閚ew/delete的底層封裝了malloc/free
  • 創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

    總結(jié)

    以上是生活随笔為你收集整理的c++中new的总结(动态管理,malloc存在的问题,malloc与new的区别)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。