網站首頁 編程語言 正文
1、內存分區(qū)模型
C++程序在執(zhí)行時,將內存大方向劃分為4個區(qū)域
- 代碼區(qū):存放函數體的二進制代碼,由操作系統(tǒng)進行管理的(所有代碼包含中文注釋)
- 全局區(qū):存放全局變量和靜態(tài)變量以及常量
- 棧區(qū):由編譯器自動分配釋放, 存放函數的參數值,局部變量等
- 堆區(qū):由程序員分配和釋放,若程序員不釋放,程序結束時由操作系統(tǒng)回收
內存四區(qū)意義:
不同區(qū)域存放的數據,賦予不同的生命周期, 給我們更大的靈活編程
2、程序運行前
在程序編譯后,生成了exe可執(zhí)行程序,未執(zhí)行該程序前分為兩個區(qū)域:
代碼區(qū):
? 存放 CPU 執(zhí)行的機器指令;
? 代碼區(qū)是共享的,共享的目的是對于頻繁被執(zhí)行的程序,只需要在內存中有一份代碼即可;
? 代碼區(qū)是只讀的,使其只讀的原因是防止程序意外地修改了它的指令;
全局區(qū):
? 全局變量和靜態(tài)變量存放在此.
? 全局區(qū)還包含了常量區(qū), 字符串常量和其他常量也存放在此.
該區(qū)域的數據在程序結束后由操作系統(tǒng)釋放.
總結:
- C++中在程序運行前分為全局區(qū)和代碼區(qū)
- 代碼區(qū)特點是共享和只讀
- 全局區(qū)中存放全局變量、靜態(tài)變量、常量
- 常量區(qū)中存放 const修飾的全局常量 和 字符串常量
3、程序運行后
棧區(qū):
? 由編譯器自動分配釋放, 存放函數的參數值,局部變量等
? 注意事項:不要返回局部變量的地址,棧區(qū)開辟的數據由編譯器自動釋放
示例:
int * func()
{
int a = 10;
return &a;
}
int main() {
int *p = func();
cout << *p << endl;
cout << *p << endl;
system("pause");
return 0;
}
堆區(qū):
? 由程序員分配釋放,若程序員不釋放,程序結束時由操作系統(tǒng)回收
? 在C++中主要利用new在堆區(qū)開辟內存
int* func()
{
// 利用new關鍵字,可以將數據開辟到堆區(qū)
// 指針 本質上是局部變量,放在棧區(qū),指針保存的數據放在堆區(qū)
int* a = new int(10); // new,開辟數據到堆區(qū),返回數據地址
return a;
}
int main() {
int *p = func();
cout << *p << endl;
cout << *p << endl;
system("pause");
return 0;
}
4、new操作符
C++中利用new操作符在堆區(qū)開辟數據?
堆區(qū)開辟的數據,由程序員手動開辟,手動釋放,釋放利用操作符:delete
? 語法:new 數據類型
? 利用new創(chuàng)建的數據,會返回該數據對應的類型的指針
int* func()
{
int* a = new int(10);
return a;
}
int main() {
int *p = func();
cout << *p << endl;
cout << *p << endl;
// 堆區(qū)的數據,由程序員管理開辟(new),程序員管理釋放(delete)
// 利用delete釋放堆區(qū)數據
delete p;
//cout << *p << endl; //報錯,釋放的空間不可訪問
system("pause");
return 0;
}
示例:開辟數組
//堆區(qū)開辟數組
int main() {
int* arr = new int[10];
for (int i = 0; i < 10; i++)
{
arr[i] = i + 100;
}
for (int i = 0; i < 10; i++)
{
cout << arr[i] << endl;
}
//釋放數組 delete 后加 []
delete[] arr;
system("pause");
return 0;
}
原文鏈接:https://blog.csdn.net/sssxlxwbwz/article/details/128060246
相關推薦
- 2022-09-23 C/C++中的靜態(tài)變量注意事項_C 語言
- 2022-06-15 oracle多表簡單查詢實例代碼_oracle
- 2023-10-17 修改火狐瀏覽器滾動條樣式
- 2022-04-26 ASP.NET?Core中的Razor頁面使用視圖組件_基礎應用
- 2022-06-29 Oracle中執(zhí)行動態(tài)SQL_oracle
- 2022-09-13 Android四大組件之Activity深入解讀生命周期_Android
- 2022-04-19 python獲取http請求響應頭headers中的數據的示例_python
- 2022-07-27 SQL解決未能刪除約束問題drop?constraint_MsSql
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學習環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發(fā)現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支