<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
在C++中,一個可執行程式的虛擬地址空間可分為,核心、棧、共用庫的記憶體對映區域、堆、資料區和程式碼段,具體分佈額如下圖所示:
核心: 作業系統
棧區: 函數的形參,非靜態的區域性變數,函數現場保護資料等等,棧是向下增長的。
共用庫的記憶體對映區域 用於裝載一個共用的動態記憶體庫。使用者可使用系統介面建立共用記憶體,做程序間通訊。
堆區: 用於程式執行時動態記憶體分配,堆是可以上增長的。
資料段: 儲存全域性資料和靜態資料,分為.bss 和.data 。
程式碼段: 可執行的程式(機器指令)和 常數資料。
C的動態記憶體管理:
在C++中 ,關於動態記憶體的申請,依靠關鍵字new來實現,new在有三種用法:
範例如下:
int n = 10; int *ipa = new int (10); int *ipb = new int [n](10); int *ipc = new int[n]{1,2,3,4,5,6,7,8};
在這裡new主要做了三個操作,
在上述的程式碼中,我們可以開闢一個空間如 ipa 所示;我們也可以開闢一組空間如ipb所示;我們也可以開闢一組空間的同時給所有或者部分元素給定初始值如ipc所示。
當然,動態記憶體的開闢後,需要我們去手動去釋放它,在C++ 中,我們通過delete來釋放記憶體,如下所示
delete ipa;
delete[]ipb;
delete[]ipc;
如上程式碼所示,當我們開闢一個空間時,我們可以直接通過其地址釋放,當我們申請一組空間時,我們需要加上**[]**,需要告訴編譯器,我們要釋放一組記憶體。
注: 當我們釋放一組記憶體時,我們不需要在[]裡面寫入需要釋放的動態記憶體的數目,原因是當我們通過new去申請一組動態記憶體時,編譯器會自動開闢空間去儲存new開闢的空間的數目大小,當我們使用delete 來釋放空間時,編譯器會自動去存取這個空間來檢視開闢的記憶體大小數目。
new當作函數使用時,其功能和malloc及其相似,唯一不同的地方在與 當申請記憶體失敗時,malloc會返回NULL,因此,我們在每次使用malloc時候必須對指標進行判空;但是new申請記憶體失敗後是丟擲異常,所以需要捕獲例外處理程式;
範例如下:
int n = 10; int *ipa = (int*)::operator new(sizeof(int)); // (int*)malloc(sizeof(int)); int *ipb = (int*)::operator new(sizeof(int)*n); // (int*)malloc(sizeof(int)*n);
當然,我們也需要delete去釋放其空間
delete(ipa); delete(ipb);
定位new的用法主要是,它不會去自己開闢空間,而是一塊已知的記憶體上分配給一個物件,但是記憶體上的資料不會被覆蓋或者改寫,其程式碼範例如下:
int n = 10; int* ipa = (int*)malloc(sizeof(int)); int* ipb = (int*)::operator new(sizeof(int) * n); new(ipa) int(20); new(ipb) int[]{ 1,2,3,4,5,6,7,8,9 };
並且 ,通過定位new的方法去把已經申請的存在的記憶體分配的方法,它可以去分配堆裡面的記憶體,也可以去分配棧裡面的記憶體;定位new的方法也可以將原本申請為int型別的記憶體看成char/double來顯示。
注: 關於C++的內建型別 int/double/char 等等 ,並不是編譯器將其劃分,而是使用者自身,當我們把資料按照4個位元組當一個整體來看待,那麼其就是整型,若是按照一個位元組為一個單位,那就是char型別;若是8個位元組看成一個單位,那就是double型別。而資料在記憶體儲存的值並不會發生任何改變。
1、new/delete 是C++中的運運算元。 malloc / free 是函數。
2、 malloc申請記憶體空間時,手動計算所需大小,new只需型別名,自動計算大小;
3、 malloc申請的記憶體空間不會初始化,new可以初始化;
4、 malloc的返回值為void*, 接收時必須強轉,new不需要;
5、 malloc申請記憶體空間失敗時,返回的是NULL,使用時必須判空;
new申請記憶體空間失敗時丟擲異常,所以要有捕獲例外處理程式;
到此這篇關於C++超詳細探究new/delete的使用的文章就介紹到這了,更多相關C++ new/delete內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援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