溫州網(wǎng)站制作多少錢谷歌google 官網(wǎng)下載
博主介紹:程序喵大人
- 35- 資深C/C++/Rust/Android/iOS客戶端開發(fā)
- 10年大廠工作經(jīng)驗
- 嵌入式/人工智能/自動駕駛/音視頻/游戲開發(fā)入門級選手
- 《C++20高級編程》《C++23高級編程》等多本書籍著譯者
- 更多原創(chuàng)精品文章,首發(fā)gzh,見文末
- 👇👇記得訂閱專欄,以防走丟👇👇
😃C++基礎(chǔ)系列專欄
😃C語言基礎(chǔ)系列
😃C++大佬養(yǎng)成攻略
在C++編程中,內(nèi)存管理是一個至關(guān)重要的概念。
要深入理解內(nèi)存管理,我們肯定要了解堆內(nèi)存和棧內(nèi)存的基本概念、區(qū)別以及它們的動態(tài)分配和釋放方法。還需要深入理解相關(guān)內(nèi)存分配函數(shù)malloc
、calloc
、realloc
的用法。
基本概念理解
棧內(nèi)存
棧內(nèi)存是由編譯器自動管理的內(nèi)存區(qū)域,用于存儲局部變量、函數(shù)參數(shù)和返回地址等。棧內(nèi)存的分配和釋放是自動進(jìn)行的:
- 當(dāng)函數(shù)被調(diào)用時,局部變量和參數(shù)會被壓入棧中;
- 當(dāng)函數(shù)返回時,這些局部變量和參數(shù)會被彈出棧并釋放。
棧內(nèi)存具有快速分配和釋放的特點,但其大小是固定的,一般也就8M左右,不能動態(tài)調(diào)整。
堆內(nèi)存
堆內(nèi)存是由程序員手動管理的內(nèi)存區(qū)域,用于動態(tài)分配內(nèi)存。
你通過malloc
、calloc
、realloc
等函數(shù)可以在堆上分配內(nèi)存,通過free
函數(shù)釋放內(nèi)存。
堆內(nèi)存的大小不固定,可以動態(tài)調(diào)整,但需要程序員負(fù)責(zé)內(nèi)存的管理,容易出現(xiàn)內(nèi)存泄漏等問題,我們常說的內(nèi)存泄露問題指的更多的就是堆內(nèi)存的泄露。
區(qū)別
- 內(nèi)存****管理:棧內(nèi)存由編譯器自動管理,堆內(nèi)存由程序員手動管理。
- 作用域:棧內(nèi)存的作用域通常是函數(shù)內(nèi)部,當(dāng)函數(shù)返回時,棧內(nèi)存會自動被釋放;堆內(nèi)存的作用域由程序員控制,只要程序員不釋放,內(nèi)存就會一直存在。
- 生命周期:棧內(nèi)存的生命周期與函數(shù)執(zhí)行時間相關(guān),函數(shù)執(zhí)行完畢后,棧內(nèi)存會被釋放;堆內(nèi)存的生命周期由程序員控制,直到顯式調(diào)用
free
函數(shù)釋放內(nèi)存。
堆內(nèi)存的使用
使用malloc
動態(tài)分配空間
malloc
函數(shù)用于在堆上分配指定大小的內(nèi)存塊。函數(shù)聲明形式為:
void* malloc(size_t size);
size
:要分配的字節(jié)數(shù)。- 返回值:指向分配的內(nèi)存塊的指針,如果分配失敗,返回
NULL
。
示例代碼:
int* ptr = (int*)malloc(sizeof(int) * 10); // 分配10個int類型的內(nèi)存空間
if (ptr == NULL) {// 處理內(nèi)存分配失敗的情況
}
使用calloc
分配并初始化內(nèi)存
calloc
函數(shù)用于在堆上分配內(nèi)存并初始化為0。函數(shù)聲明形式為:
void* calloc(size_t num, size_t size);
num
:要分配的元素個數(shù)。size
:每個元素的字節(jié)數(shù)。- 返回值:指向分配的內(nèi)存塊的指針,如果分配失敗,返回
NULL
。
示例代碼:
int* ptr = (int*)calloc(10, sizeof(int)); // 分配10個int類型的內(nèi)存空間,并初始化為0
if (ptr == NULL) {// 處理內(nèi)存分配失敗的情況
}
使用realloc
調(diào)整內(nèi)存大小
realloc
函數(shù)用于調(diào)整已分配內(nèi)存塊的大小。函數(shù)聲明形式為:
void* realloc(void* ptr, size_t size);
ptr
:指向要調(diào)整大小的內(nèi)存塊的指針。size
:新的內(nèi)存塊大小(字節(jié)數(shù))。- 返回值:指向新的內(nèi)存塊的指針,如果分配失敗,返回
NULL
,原內(nèi)存塊保持不變。
示例代碼:
int* ptr = (int*)malloc(sizeof(int) * 10); // 初始分配10個int類型的內(nèi)存空間
if (ptr == NULL) {// 處理內(nèi)存分配失敗的情況
}// 使用realloc調(diào)整內(nèi)存大小
ptr = (int*)realloc(ptr, sizeof(int) * 20);
if (ptr == NULL) {// 處理內(nèi)存調(diào)整失敗的情況,注意原內(nèi)存塊仍然有效
}
使用free
釋放內(nèi)存
free
函數(shù)用于釋放之前通過malloc
、calloc
或realloc
分配的內(nèi)存空間。函數(shù)聲明形式為:
void free(void* ptr);
ptr
:指向要釋放的內(nèi)存塊的指針。
示例代碼:
int* ptr = (int*)malloc(sizeof(int) * 10); // 分配10個int類型的內(nèi)存空間
if (ptr == NULL) {// 處理內(nèi)存分配失敗的情況
}// 使用內(nèi)存...free(ptr); // 釋放內(nèi)存
ptr = NULL; // 將指針置為NULL,避免懸掛指針
棧內(nèi)存與堆內(nèi)存的對比
編程實踐展示
以下示例展示了棧內(nèi)存和堆內(nèi)存的不同使用場景和特性:
#include <stdio.h>
#include <stdlib.h>void stackMemoryExample() {int stackVar = 10; // 棧內(nèi)存,函數(shù)返回時自動釋放printf("Stack variable: %d\n", stackVar);
}void heapMemoryExample() {int* heapVar = (int*)malloc(sizeof(int)); // 堆內(nèi)存,需要手動釋放if (heapVar == NULL) {fprintf(stderr, "Memory allocation failed\n");return;}*heapVar = 20;printf("Heap variable: %d\n", *heapVar);free(heapVar); // 釋放堆內(nèi)存heapVar = NULL; // 避免懸掛指針
}int main() {stackMemoryExample(); // 調(diào)用棧內(nèi)存示例函數(shù)heapMemoryExample(); // 調(diào)用堆內(nèi)存示例函數(shù)return 0;
}
其中
stackMemoryExample
函數(shù)使用了棧內(nèi)存來存儲局部變量stackVar
,當(dāng)函數(shù)返回時,stackVar
會自動釋放。
而heapMemoryExample
函數(shù)則使用堆內(nèi)存來存儲變量heapVar
,并通過malloc
分配內(nèi)存,通過free
釋放內(nèi)存。
練習(xí)
- 編寫一個程序,動態(tài)分配一個整型數(shù)組的內(nèi)存空間,用于存儲用戶輸入的5個整數(shù),然后遍歷并打印這些整數(shù)。最后,釋放分配的內(nèi)存。
- 編寫一個程序,包含兩個函數(shù)。第一個函數(shù)使用棧內(nèi)存(局部變量)存儲并打印一個整數(shù)數(shù)組;第二個函數(shù)使用堆內(nèi)存動態(tài)分配并存儲用戶輸入的整數(shù)數(shù)組,然后打印并釋放內(nèi)存。通過這兩個函數(shù)的調(diào)用,展示棧內(nèi)存和堆內(nèi)存在使用上的區(qū)別。
進(jìn)階
- 為什么malloc時候需要傳遞長度信息,而free時候卻不需要傳遞長度信息呢?會不會多釋放一些內(nèi)存或者少釋放了一些內(nèi)存?
- malloc更底層的原理是什么?一次malloc底層都經(jīng)歷了什么?
- 棧內(nèi)存和堆內(nèi)存的區(qū)別?
- 什么場景下使用棧,什么場景下使用堆呢?
- 棧數(shù)組下標(biāo)越界訪問會發(fā)生什么?
- 什么是棧溢出?
- 了解下常見的棧攻擊手段。
碼字不易,歡迎大家點贊,關(guān)注,評論,謝謝!
C++訓(xùn)練營
專為校招、社招3年工作經(jīng)驗的同學(xué)打造的1V1 C++訓(xùn)練營,量身定制學(xué)習(xí)計劃、每日代碼review,簡歷優(yōu)化,面試輔導(dǎo),已幫助多名學(xué)員獲得offer!訓(xùn)練營介紹