<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
C語言記憶體管理方式在C++中可以繼續使用,但有些地方就無能為力而且使用起來比較麻煩,因此C++又提出了自己的記憶體管理方式:通過new和delete操作符進行動態記憶體管理
這裡在動態申請和釋放時一定要匹配使用
但是我們發現即使我們隨意使用程式也沒有崩潰,但是這些開闢的空間都是預設型別的
我們接下來試一下開闢自定義型別的空間程式是否會崩潰
我們執行程式,發現直接就崩潰了
那為什麼自定義的型別就不可以隨意使用釋放記憶體的函數呢?這就要探究malloc,free和new,delete的區別。我們先來看malloc和free
然後再看new和delete
然後執行起來我們轉到反組合程式碼看看
總結new的實現就是呼叫operate new(size_t)函數,函數內部循壞呼叫malloc如果申請空間成功就返回,如果申請失敗就檢測是否有應對措施,如果提供就執行措施,再繼續malloc,如果未提供就丟擲異常。然後再呼叫建構函式將申請的記憶體初始化。
進入不知名函數
那麼我們來看看operator delete(void *pt)函數是如何如何實現的
總結:delete 的實現就是先呼叫類中的解構函式,將物件中的資料清空,然後呼叫operator delete(void *pt)函數,將記憶體釋放掉。
執行完這一系列操作後就會呼叫n次建構函式,將物件構造成功總結:new []就是呼叫operate new[]函數,在operate new []中呼叫operate new函數執行剛剛的一系列操作,然後返回申請的記憶體。再呼叫n次建構函式將申請的記憶體初始化。
總結:delete函數就是先呼叫n次解構函式將申請的記憶體空間中的資料清空,然後再呼叫operate delete()函數將記憶體釋放掉。
既然有了new和delete這麼好的申請記憶體的方法,那我們為什麼還要重新實現new和delete呢?注意這裡的重新實現實現new和delete並不是重新實現new和delete的申請記憶體的方式,而是有時我們再debug版本下偵錯時需要一些列印輸出一些資訊,這裡我們需要再用new申請記憶體的時候要實現輸出一些資訊。比如說列印檔名,呼叫函數,呼叫行數等等。我們重新實現new將我們的檔案資訊,呼叫函數,呼叫行數都列印出來
可以看到雖然將函數都列印出來了但是傳參的時候需要傳許多引數,所以我們可以用宏替換的方式來解決
但是我們需要這些資訊都是在偵錯的時候才需要,所以我們可以條件編譯一下只在debug版本底下執行
我們將delete實現過載,
注意這裡如果我們將delete自己實現過載之後再呼叫delete過載函數是不會呼叫類中的解構函式的,如果我們的物件中涉及了資源的申請那麼就不會釋放。
使用場景:在有些場景下我們可能會申請一塊記憶體空間,但是這塊記憶體空間並沒有初始化,當我們想要使用這塊記憶體空間時,想給他初始化,對於類型別的物件我們想要給他初始化時,只能呼叫建構函式初始化,但是建構函式只能在建立時由編譯器自動呼叫(就像人不可以選擇自己的出生時間),那我們這時就要使用定位new來給已經申請號的記憶體中建立一個物件。
定位new的幾種使用方式:
釋放空間時
定位new的原理:
_CrtDumpMemoryLeaks();函數是window作業系統提供的一個api(應用程式介面)函數,當程式中有記憶體漏失時就會在底行輸出記憶體漏失資訊。
我們將申請的空間正確釋放,可以看到沒有任何的提示。
本篇文章就到這裡了,希望能夠給你帶來幫助,也希望您能夠多多關注it145.com的更多內容!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45