網站首頁 編程語言 正文
C/C++內存分布
int globalVar = 1; static int staticGlobalVar = 1; void Test() { static int staticVar = 1; int localVar = 1; int num1[10] = {1, 2, 3, 4}; char char2[] = "abcd"; char* pChar3 = "abcd"; int* ptr1 = (int*)malloc(sizeof (int)*4); int* ptr2 = (int*)calloc(4, sizeof(int)); int* ptr3 = (int*)realloc(ptr2, sizeof(int)*4); free (ptr1); free (ptr3); }
習題
1. 選擇題: 選項: A.棧 B.堆 C.數據段(靜態區) D.代碼段(常量區) globalVar在哪里?__C__ staticGlobalVar在哪里?__C__ staticVar在哪里?__C__ localVar在哪里?__A__ num1 在哪里?__A__ char2在哪里?__A__ *char2在哪里?_A__ pChar3在哪里?_A___ *pChar3在哪里?__D__ ptr1在哪里?__A__ *ptr1在哪里?__B__ 2. 填空題:(32位程序) sizeof(num1) = __40__; sizeof(char2) = __5__; strlen(char2) = __4__; sizeof(pChar3) = __4__; strlen(pChar3) = __4__; sizeof(ptr1) = __4__;
1.堆又叫堆棧,非靜態局部變量、函數參數、返回值等等,棧是向下增長的。
2.內存映射段是高效的I/O映射方式,用于裝載一個共享的動態內存庫。用戶可使用系統接口創建共享內存,做進程間通信。
3.堆用于程序運行時動態內存分配,堆是可以向上增長的。
4.數據段 – 存儲全局數據和靜態數據。
5.代碼段 – 可執行的代碼/只讀常量?
C語言中動態內存管理方式
malloc
,?calloc
,?realloc
?的區別?
calloc
?會初始化, 相當于?malloc
?+?memset
, 按字節初始化,空間每個字節都初始化為0。realloc
擴容,分為原地擴,異地擴。
C++ 內存管理方式
申請和釋放單個元素的空間,使用new和delete操作符,申請和釋放連續的空間,使用new[]和delete[]。
int* p1 = new int(5);
動態申請一個int
空間,這塊空間初始化為5.
int* p2 = new int[5];
動態申請5個int
空間。
int* p3 = new int[5]{1,2,3,4,5};
給上初始值
new和delete操作自定義類型
在申請自定義類型的空間時,new
?會調用構造函數,?delete
?會調用析構函數,而?malloc
?與?free
?不會。
operator new
?與?operator delete
函數
new
?和?delete
?是用戶進行 動態內存申請 和釋放的操作符,?operator new
?和?operator delete
?是系統提供的全局函數。
new 在底層調用operator new
全局函數來申請空間,delete 在底層通過operator delete全局函數來釋放空間。
-
operator new
?:該函數通過?malloc
?來申請空間,當?malloc
?申請空間成功時直接返回;申請空間失敗,嘗試執行空間不足應對措施,如果改應對措施用戶設置了,則就行申請,否則 跑異常。 -
operator delete
:該函數最終是通過free
來釋放空間的。?
new和delete的實現原理
1.內置類型
如果申請的是內置類型的空間,?new
?和?malloc
,?delete
和free
基本類似,不同的地方是:new
/delete
申請和釋放的是單個元素的空間。
new[]
?和?delete[]
?申請的是連續空間,而且new
在申請空間失敗時會拋異常,?malloc
?會返回?NULL
。
2.自定義類型
- new原理
1.調用?operator new?函數申請空間
2.在申請的空間上執行構造函數,完成對象的構造。?
- delete的原理
1.在空間上執行析構函數,完成對象中資源的清理工作。
2.調用?operator delete?函數釋放對象的空間。
- ?new T[N]的原理
1.調用operator new[]函數,在operator new[]中實際調用operator new函數完成N個對象空間的申請
2.在申請的空間上執行N次構造函數?
- delete[]的原理
1.在釋放的對象空間上執行N次析構函數,完成N個對象中資源的清理
2.調用operator delete[]釋放空間,實際在operator delete[]中調用operator delete來釋放空間?
malloc/free和new/delete的區別
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在釋放空間前會調用析構函數完成空間中資源的清理
總結
原文鏈接:https://blog.csdn.net/Joy_Cheung666/article/details/122652132
相關推薦
- 2023-03-28 react-redux的connect示例詳解_React
- 2022-08-08 pandas?給dataframe添加列名的兩種方法_python
- 2022-07-30 Linux的磁盤配額設置
- 2023-09-12 過擬合(over fit)和欠擬合(under fit)
- 2022-04-07 代碼詳解Python的函數基礎(1)_python
- 2022-05-29 利用Python將list列表寫入文件并讀取的方法匯總_python
- 2022-09-25 Idea maven項目報錯:Unable to import maven project: See
- 2023-05-24 Pytorch:Conv2d卷積前后尺寸詳解_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支