最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++內(nèi)存管理看這一篇就夠了

 更新時間:2021年08月16日 16:28:45   作者:幾葉知期  
這篇文章主要介紹了C/C++中的內(nèi)存管理小結(jié),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

1 內(nèi)存分布圖

在這里插入圖片描述

注意:

1.向下生長:地址由高到低
2.向上生長:地址由低到高
3.棧又叫堆棧,非靜態(tài)局部變量/函數(shù)參數(shù)/返回值等等
4.堆用于程序運行時動態(tài)內(nèi)存分配

2 C語言和C++內(nèi)存分配實現(xiàn)

2.1 C語言實現(xiàn)

malloc函數(shù)

 void *malloc(size_t size) 

分配所需的內(nèi)存空間,單位是字節(jié),并返回一個指向它的指針。

int* ptr_int = (int*)malloc(4*sizeof(int));//開辟空間
free(ptr_int);//釋放空間

calloc函數(shù)

void *calloc(size_t nitems, size_t size) 

分配所需的內(nèi)存空間,并返回一個指向它的指針。nitems – 要被分配的元素個數(shù)。size – 元素的大小。malloc 和 calloc 之間的不同點是,malloc 不會設(shè)置內(nèi)存為零,而 calloc 會設(shè)置分配的內(nèi)存為零。

char* ptr_char = (char*)calloc(4, sizeof(char));
free(ptr_char);

realloc

void *realloc(void *ptr, size_t size) 

嘗試重新調(diào)整之前調(diào)用 malloc 或 calloc 所分配的ptr 所指向的內(nèi)存塊的大小。ptr – 指針指向一個要重新分配內(nèi)存的內(nèi)存塊,該內(nèi)存塊之前是通過調(diào)用 malloc、calloc 或 realloc 進行分配內(nèi)存的。如果為空指針,則會分配一個新的內(nèi)存塊,且函數(shù)返回一個指向它的指針。

size – 內(nèi)存塊的新的大小,以字節(jié)為單位。如果大小為 0,且 ptr 指向一個已存在的內(nèi)存塊,則 ptr 所指向的內(nèi)存塊會被釋放,并返回一個空指針。

int* ptr_int = (int*)malloc(4*sizeof(int));
char* ptr_char = (char*)calloc(4, sizeof(char));

int* ptr_int1 = (int*)realloc(ptr_int, 8 * sizeof(int));
char* ptr_char1 = (char*)realloc(ptr_char, 8 * sizeof(char));

2.2 C++實現(xiàn)

在這里插入圖片描述

new和delete的實現(xiàn)原理

1 內(nèi)置類型

  • 如果申請的是內(nèi)置類型的空間,new和malloc,delete和free基本類似,不同的地方是:new/delete申請和釋放的是單個元素的空間,new[]和delete[]申請的是連續(xù)空間,而且new在申請空間失敗時會拋異常,malloc會返回NULL。

2 自定義類型

new的原理

1.調(diào)用operator new函數(shù)申請空間

2.在申請的空間上執(zhí)行構(gòu)造函數(shù),完成對象的構(gòu)造

delete的原理

1.在空間上執(zhí)行析構(gòu)函數(shù),完成對象中資源的清理工作

2.調(diào)用operator delete函數(shù)釋放對象的空間

3 C語言和C++內(nèi)存管理區(qū)別

malloc/free和new/delete的共同點是:都是從堆上申請空間,并且需要用戶手動釋放。不同的地方是:

1.malloc和free是函數(shù),new和delete是操作符

2.malloc申請的空間不會初始化,new可以初始化

3.malloc申請空間時,需要手動計算空間大小并傳遞,new只需在其后跟上空間的類型即可

4.malloc的返回值為void*, 在使用時必須強轉(zhuǎn),new不需要,因為new后跟的是空間的類型

5.malloc申請空間失敗時,返回的是NULL,因此使用時必須判空,new不需要,但是new需要捕獲異常

6.申請自定義類型對象時,malloc/free只會開辟空間,不會調(diào)用構(gòu)造函數(shù)與析構(gòu)函數(shù),而new在申請空間后會調(diào)用構(gòu)造函數(shù)完成對象的初始化,delete在釋放空間前會調(diào)用析構(gòu)函數(shù)完成空間中資源的清理

4 內(nèi)存泄漏

什么是內(nèi)存泄漏:

內(nèi)存泄漏指因為疏忽或錯誤造成程序未能釋放已經(jīng)不再使用的內(nèi)存的情況。內(nèi)存泄漏并不是指內(nèi)存在物理上的消失,而是應(yīng)用程序分配某段內(nèi)存后,因為設(shè)計錯誤,失去了對該段內(nèi)存的控制,因而造成了內(nèi)存的浪費。

內(nèi)存泄漏的危害:長期運行的程序出現(xiàn)內(nèi)存泄漏,影響很大,如操作系統(tǒng)、后臺服務(wù)等等,出現(xiàn)內(nèi)存泄漏會導(dǎo)致響應(yīng)越來越慢,最終卡死。

堆內(nèi)存泄漏(Heap leak)

堆內(nèi)存指的是程序執(zhí)行中依據(jù)須要分配通過malloc / calloc / realloc / new等從堆中分配的一塊內(nèi)存,用完后必須通過調(diào)用相應(yīng)的 free或者delete 刪掉。假設(shè)程序的設(shè)計錯誤導(dǎo)致這部分內(nèi)存沒有被釋放,那么以后這部分空間將無法再被使用,就會產(chǎn)生Heap Leak。

系統(tǒng)資源泄漏

指程序使用系統(tǒng)分配的資源,比方套接字、文件描述符、管道等沒有使用對應(yīng)的函數(shù)釋放掉,導(dǎo)致系統(tǒng)資源的浪費,嚴重可導(dǎo)致系統(tǒng)效能減少,系統(tǒng)執(zhí)行不穩(wěn)定。

總結(jié)

本篇文章就到這里了,希望能給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • 使用Spring Data Jpa的CriteriaQuery一個陷阱

    使用Spring Data Jpa的CriteriaQuery一個陷阱

    使用Spring Data Jpa的CriteriaQuery進行動態(tài)條件查詢時,可能會遇到一個陷阱,當(dāng)條件為空時,查詢不到任何結(jié)果,并不是期望的返回所有結(jié)果。這是為什么呢?
    2020-11-11
  • Mybatis Plus查詢時sql字段名大小寫報錯的解決

    Mybatis Plus查詢時sql字段名大小寫報錯的解決

    這篇文章主要介紹了Mybatis Plus查詢時sql字段名大小寫報錯的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Java實現(xiàn)簡單的學(xué)生教師管理系統(tǒng)

    Java實現(xiàn)簡單的學(xué)生教師管理系統(tǒng)

    這篇文章主要為大家詳細介紹了Java實現(xiàn)簡單的學(xué)生教師管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • java中String的常見用法總結(jié)

    java中String的常見用法總結(jié)

    以下是關(guān)于string的七種用法,注意哦,記得要時常去查看java的API文檔,那個里面也有很詳細的介紹
    2013-10-10
  • 關(guān)于遠程調(diào)用RestTemplate的使用避坑指南

    關(guān)于遠程調(diào)用RestTemplate的使用避坑指南

    這篇文章主要介紹了關(guān)于遠程調(diào)用RestTemplate的使用避坑指南,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • SpringBoot中YAML語法及幾個注意點說明

    SpringBoot中YAML語法及幾個注意點說明

    這篇文章主要介紹了SpringBoot中YAML語法及幾個注意點說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • Java實現(xiàn)郵件發(fā)送遇到的問題

    Java實現(xiàn)郵件發(fā)送遇到的問題

    本文給大家分享的是個人在項目過程中,使用Java實現(xiàn)郵件發(fā)送的時候所遇到的幾個問題以及解決方法,有需要的小伙伴可以參考下
    2016-09-09
  • Java使用CompletableFuture實現(xiàn)異步編程

    Java使用CompletableFuture實現(xiàn)異步編程

    在現(xiàn)代 Java 開發(fā)中,異步編程是一項重要技能,而 CompletableFuture 是從 Java 8 開始提供的一個功能強大的工具,用于簡化異步任務(wù)的編寫和組合,本文將詳細介紹 CompletableFuture 的基本使用和一些常見的應(yīng)用場景,需要的朋友可以參考下
    2025-01-01
  • IDEA編譯時報常量字符串過長的解決辦法

    IDEA編譯時報常量字符串過長的解決辦法

    本文主要介紹了IDEA編譯時報常量字符串過長的解決辦法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • Maven中resources標(biāo)簽的用法詳解

    Maven中resources標(biāo)簽的用法詳解

    本文主要介紹了Maven中resources標(biāo)簽的用法詳解,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01

最新評論

延寿县| 梁山县| 容城县| 长子县| 武隆县| 承德县| 铅山县| 亚东县| 吉林市| 阿荣旗| 阿克陶县| 上杭县| 桃园市| 山东| 泽库县| 云安县| 溧阳市| 思南县| 宽城| 彭山县| 金川县| 宁蒗| 潮州市| 格尔木市| 徐闻县| 冕宁县| 军事| 滨海县| 绥阳县| 香格里拉县| 扬中市| 宁波市| 响水县| 灯塔市| 天水市| 永春县| 满城县| 五峰| 织金县| 岱山县| 正阳县|