網站首頁 編程語言 正文
可執行程序的虛擬地址空間
- 內核:存放操作系統
- 棧區:函數的形參,非靜態的局部變量,函數現場 保護數據等等,棧是向下增長的。
- 共享庫的內存映射區域:用于裝載一個共享的動態內存庫。用戶可使用系統接口創建共享內存,做進程間通信。
- 堆區:用于程序運行時動態內存分配,堆是可以上增長的。
- 數據:存儲全局數據和靜態數據,分為.bss和.data 。
- 代碼:可執行的程序(機器指令)和常量數據。
1.new的運算符用法(關鍵字)
int* p= new int(10);
這里的new的用法是當作運算符的用法,該用法一共有四個步驟:
- 計算類型
- 申請一個空間(因為new的底層是malloc)
- 將所取得的空間初始化
- 將申請到的地址返回
2.new的函數用法
new當作函數用法使用的是時候,類似malloc,都是申請一個空間,區別在于,返回值不同;當空間不足時malloc會返回一個“nullptr”,operator new會返回一個throw_bad的異常。
當我們加入一個nothrow后:
這樣申請錯誤后,我們返回的是空指針。
對于malloc我們不可以進行初始化,new也不可以初始化。
所以當new作為函數時就相當于malloc。
3.定位new
定位new用法與構造new十分相似,是在已經確定的空間當中,構造一個對象,并將該對象放置到聲明的空間當中。
int main()
{
int n = 10;
int* ipa = (int*)ma11oc(sizeof(int));
int* ipb = (int*) : :operator new(sizeof(int) * n);
new(ipa) int(20);
new(ipb) int[]{ 1,2,3,4,5,6,7,8,9 };
free(ipa);
: :operator delete(ipb);
return 0;
}
不需要開辟相應的空間 合法空間即可 給出某個地址 即可根據要求進行相應操作。
4.new創建對象
new創建對象特點:
- new創建對象需要指針接收,一處初始化,多處使用。
- new創建對象使用完需delete銷毀。
- new創建對象直接使用堆空間,而局部不用new定義對象則使用棧空間。
- new對象指針用途廣泛,比如作為函數返回值、函數參數等。
- 頻繁調用場合并不適合new,就像new申請和釋放內存一樣。
new創建對象例子:
CTest* pTest = new CTest();
delete pTest;
pTest用來接收對象指針。
不用new,直接使用類定義申明:
CTest mTest;
此種創建方式,使用完后不需要手動釋放,該類析構函數會自動執行。
而new申請的對象,則只有調用到delete時再會執行析構函數,如果程序退出而沒有執行delete則會造成內存泄漏。
C Test* pTest = NULL;
但使用普通方式創建的類對象,在創建之初就已經分配了內存空間。
這類指針,如果未經過對象初始化,則不需要delete釋放。
5.delete
delete運算符使用的一般格式為
delete [ ]指針變量
例如要撤銷上面用new開辟的空間用:
delete p;
如果我們用“new char[10];”開辟的字符數組空間,把new返回的指針賦給了指針變量pt,則應該用以下形式的delete運算符撤銷該空間:
delete [] pt;
一般來說delete與new需要配對使用。
6.對于內置類型new/delete/malloc/free可以混用
- new/delete是C++中的運算符。malloc / free是函數。
- malloc申請內存空間時,手動計算所需大小,new只需類型名,自動計算大小;
- malloc申請的內存空間不會初始化,new可以初始化;
- malloc的返回值為void*,接收時必須強轉,new不需要;
- malloc申請內存空間失敗時,返回的是NULL,使用時必須判空;new申請內存空間失敗時返回異常
7.使用注意事項
動態分配失敗,則返回一個空指針(NULL),表示發生了異常,堆資源不足,分配失敗。
指針刪除與堆空間釋放。刪除一個指針p(delete p;)實際意思是刪除了p所指的目標(變量或對象等),釋放了它所占的堆空間,而不是刪除p本身(指針p本身并沒有撤銷,它自己仍然存在,該指針所占內存空間并未釋放),釋放堆空間后,p成了空指針。
內存泄漏(memory leak)和重復釋放。new與delete 是配對使用的, delete只能釋放堆空間。如果new返回的指針值丟失,則所分配的堆空間無法回收,稱內存泄漏,同一空間重復釋放也是危險的,因為該空間可能已另分配,所以必須妥善保存new返回的指針,以保證不發生內存泄漏,也必須保證不會重復釋放堆內存空間。
動態分配的變量或對象的生命期。我們也稱堆空間為自由空間(free store),但必須記住釋放該對象所占堆空間,并只能釋放一次,在函數內建立,而在函數外釋放,往往會出錯。
要訪問new所開辟的結構體空間,無法直接通過變量名進行,只能通過賦值的指針進行訪問。
用new和delete可以動態開辟和撤銷地址空間。在編程序時,若用完一個變量(一般是暫時存儲的數據),下次需要再用,但卻又想省去重新初始化的功夫,可以在每次開始使用時開辟一個空間,在用完后撤銷它。
原文鏈接:https://blog.csdn.net/weixin_56935264/article/details/124858025
相關推薦
- 2023-01-21 一文帶你學會C語言中的qsort函數_C 語言
- 2022-12-01 Entity?Framework使用DBContext實現增刪改查_實用技巧
- 2022-03-15 this.$cookie.set(‘token‘, data.token) token賦值失效
- 2022-03-21 C++名稱空間介紹_C 語言
- 2022-12-23 Android入門之SubMenu的實現詳解_Android
- 2023-06-04 pandas.DataFrame中提取特定類型dtype的列_python
- 2023-02-01 python多線程、網絡編程、正則表達式詳解_python
- 2022-12-01 SQL?Server修改數據的幾種語句詳解_MsSql
- 最近更新
-
- 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同步修改后的遠程分支