欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++內存管理看這一篇就夠了

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

1 內存分布圖

在這里插入圖片描述

注意:

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

2 C語言和C++內存分配實現

2.1 C語言實現

malloc函數

 void *malloc(size_t size) 

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

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

calloc函數

void *calloc(size_t nitems, size_t size) 

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

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

realloc

void *realloc(void *ptr, size_t size) 

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

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

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++實現

在這里插入圖片描述

new和delete的實現原理

1 內置類型

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

2 自定義類型

new的原理

1.調用operator new函數申請空間

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

delete的原理

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

2.調用operator delete函數釋放對象的空間

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

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

1.malloc和free是函數,new和delete是操作符

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

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

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

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

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

4 內存泄漏

什么是內存泄漏:

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

內存泄漏的危害:長期運行的程序出現內存泄漏,影響很大,如操作系統、后臺服務等等,出現內存泄漏會導致響應越來越慢,最終卡死。

堆內存泄漏(Heap leak)

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

系統資源泄漏

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

總結

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

相關文章

  • Java實現批量導入excel表格數據到數據庫中的方法

    Java實現批量導入excel表格數據到數據庫中的方法

    這篇文章主要介紹了Java實現批量導入excel表格數據到數據庫中的方法,結合實例形式詳細分析了java導入Excel數據到數據庫的具體步驟與相關操作技巧,需要的朋友可以參考下
    2017-10-10
  • Java 根據網絡URL獲取該網頁上面所有的img標簽并下載圖片

    Java 根據網絡URL獲取該網頁上面所有的img標簽并下載圖片

    這篇文章主要介紹了Java 根據網絡URL獲取該網頁上面所有的img標簽并下載圖片,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下
    2020-11-11
  • Java使用遞歸回溯完美解決八皇后的問題

    Java使用遞歸回溯完美解決八皇后的問題

    這篇文章主要介紹了Java基于循環(huán)遞歸回溯實現八皇后問題算法,結合具體實例形式分析了java的遍歷、遞歸、回溯等算法實現八皇后問題的具體步驟與相關操作技巧,需要的朋友可以參考下
    2021-11-11
  • 使用resty Quartz執(zhí)行定時任務的配置方法

    使用resty Quartz執(zhí)行定時任務的配置方法

    這篇文章主要為大家介紹了使用resty?Quartz來執(zhí)行定時任務的配置方法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步
    2022-03-03
  • MVC頁面之間參數傳遞實現過程圖解

    MVC頁面之間參數傳遞實現過程圖解

    這篇文章主要介紹了MVC頁面之間參數傳遞實現過程圖解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-11-11
  • JVM的類加載器和雙親委派模式你了解嗎

    JVM的類加載器和雙親委派模式你了解嗎

    這篇文章主要為大家詳細介紹了JVM類加載器和雙親委派模式,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • m1 Mac設置多jdk版本并動態(tài)切換的實現

    m1 Mac設置多jdk版本并動態(tài)切換的實現

    本文主要介紹 Mac 下如何安裝 JDK 并且多版本如何切換,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • 詳解FileInputStream讀取文件數據的兩種方式

    詳解FileInputStream讀取文件數據的兩種方式

    這篇文章主要介紹了詳解FileInputStream讀取文件數據的兩種方式,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-08-08
  • java使用正則表達式判斷手機號的方法示例

    java使用正則表達式判斷手機號的方法示例

    這篇文章主要介紹了java使用正則表達式判斷手機號的方法,分析了手機號碼段的原理及java使用正則表達式針對手機號的匹配操作實現技巧,需要的朋友可以參考下
    2017-06-06
  • java多線程下載文件原理解析

    java多線程下載文件原理解析

    這篇文章主要為大家詳細介紹了java多線程下載文件原理,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-04-04

最新評論