成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

EasyC++16,指針初探之二

開發 后端
指針由于能夠操作內存,所以如果使用的時候不夠仔細,很容易引發一些意想不到的錯誤。

[[431850]]

大家好,我是梁唐。

想要追求更好閱讀體驗的同學,可以點擊文末的「閱讀原文」,訪問github倉庫。

危險的case

指針由于能夠操作內存,所以如果使用的時候不夠仔細,很容易引發一些意想不到的錯誤。

C++ Primer當中給了這樣一個例子:

  1. int *ptr; 
  2. *ptr = 2333; 

在這段代碼當中我們聲明了一個int型的指針,并且將它指向了2333。然而,這里有一個問題,我們在聲明指針的時候并沒有進行初始化。沒有初始化的指針并不為空,而是指向一個未知的地方。如果說它指向的是一個常量1200的地址,我們讓它等于2333,那么之后當我們使用1200這個常量的時候,得到的結果都是2333。

更可怕的是,整個過程非常地隱蔽,很難察覺。debug的時候會令人抓狂。

所以千萬不要修改一個沒有初始化的指針指向的值。

指針和數字

C++ Primer當中還給了另外一個例子,當我們輸出指針的時候,得到的是一串十六進制的數。那我們能不能反過來將一個十六進制的數賦值給指針呢?

  1. int *p; 
  2. p = 0xB8000000; 

答案是不行,因為類型不一致。雖然我們打印指針的時候看起來得到是十六進制數,但它的類型其實是指針類型,而不是整數類型。所以我們將一個整數賦值給一個指針是不行的,如果非要賦值,必須要進行類型轉換。

  1. int *p; 
  2. p = (int*) 0xB8000000; 

但是這一轉換之后顯然又出現了一個問題,我們知道0xB8000000這個地址指向哪里么?顯然不知道,自然也就說不清改了這里的值之后會引發什么結果。

所以雖然這么做可行,但也強烈不建議這樣干。

new操作

前文說過使用指針有一個非常大的好處就是可以在程序運行的時候,動態分配內存。其實在C語言當中也有類似的功能,可以使用malloc來分配內存。不過在C++當中有了更好用的運算符——new。

比如我們要動態創建一個int類型的變量,可以這樣寫:

  1. int *ptr = new int

new運算符根據之后的類型確定需要的內存大小,找到這樣的內存之后,返回地址。剛好指針接收的值就是內存地址,因此剛好可以完成這樣的賦值操作。

上面的代碼也可以寫成這樣:

  1. int a; 
  2. int *ptr = &a; 

這兩者有什么區別呢?表面上看沒有區別,都是創建了一個int類型的變量。只不過第二種寫法除了可以使用指針ptr之外,還可以使用變量名a來訪問這個int。

但實際上這兩者的內部實現完全不同,我們直接通過變量名創建的變量它的值會被存儲在棧內存當中,而通過new創建的對象則被存儲在堆內存當中。棧內存是由系統自動分配,而堆內存則是由程序員進行申請使用。這兩者的內存模型是完全不同的,我們會在之后的文章詳細地討論這點。目前簡單來理解的話,就是堆內存更加靈活,它的空間也更大,可以存儲下更大的數據。

delete操作

有了動態創建,自然也就有動態刪除,所以C++當中有一個delete操作和new相對應。

delete運算符可以在變量使用結束之后,將內存歸還給內存池。因為很多時候程序當中的變量都是一次性使用或者是有生命周期的,當生命周期結束,使命完成就沒有必要繼續占用著資源了。畢竟系統內的內存資源是有限的,尤其是在一些大型項目或者嵌入式系統當中,內存資源非常緊張。

delete運算符之后跟一個指針,它會釋放改指針指向的內存。

  1. int *ptr = new int
  2. delete ptr; 

這里面有很多坑,千萬要當心。首先是使用了new創建了內存之后,一定要記得delete,否則這塊內存將會永遠被占用無法得到釋放,這種情況被稱為內存泄漏(memory leak)。另外,我們不能delete一個已經delete過的指針,這也會引發嚴重錯誤。C++ Primer對此的描述是:什么情況都可能發生。當然也不能再使用一個已經被delete的指針,這會引發空指針錯誤。

指針對于C++來說是一把雙刃劍,像是Java、Python、Go等其他語言,內存回收的工作都是由系統自動執行的。例如Java的JVM虛擬機設計了嚴密的GC(垃圾回收)機制,程序員無須關心內存的回收問題,全部交給程序自動完成。

 

而在C++當中,這一過程是由程序員手動執行的,某種程度上來說,這當然非常好,程序員擁有了很高的權限以及靈活度。但同樣也是一個坑,尤其是在復雜系統當中,很難準確判斷delete執行的時間。這會引發嚴重的問題,例如內存泄漏嚴重,野指針到處飛等……

 

責任編輯:武曉燕 來源: Coder梁
相關推薦

2021-10-27 16:27:20

C++指針操控

2021-10-29 09:44:50

C++指針變量

2021-12-12 18:13:54

C++This指針

2021-10-26 00:19:51

C++結構體存儲

2021-11-09 10:38:16

C++Const指針

2021-11-10 10:48:36

C++函數指針

2021-12-29 20:31:40

C++多態指針

2021-11-26 00:03:20

C++編譯常量

2021-12-09 10:56:50

函數C++原型

2021-12-08 10:43:09

C++實現

2021-12-10 10:45:36

C++函數Stock

2021-12-30 14:58:58

C++函數動態

2021-12-11 19:02:03

函數C++對象

2021-11-27 11:50:09

C++靜態持續

2021-12-20 21:01:52

鴻蒙HarmonyOS應用

2021-10-26 15:36:17

C++枚舉值類型

2021-12-05 18:20:42

C++空間特性

2021-12-15 10:25:57

C++運算符重載

2022-01-04 16:35:42

C++Protected關鍵字

2021-10-21 18:52:00

C++數組存儲
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 一本久久a久久精品亚洲 | 婷婷五月色综合香五月 | 天堂中文在线观看 | 一区二区三区视频播放 | 一区二区高清 | 欧美日韩一区精品 | 91不卡| 久久综合狠狠综合久久综合88 | 国产精品一区一区三区 | 国产午夜视频 | 九九久久久久久 | 欧美日韩国产中文字幕 | 亚洲精品99| 视频在线一区二区 | 午夜av毛片 | 天天干天天插天天 | 91国在线| 亚洲国产欧美在线人成 | 99视频在线播放 | 91电影在线 | 日本成人午夜影院 | 久久久久国产一区二区三区 | 久久国产精品一区二区三区 | 午夜影院视频在线观看 | 亚洲第一在线视频 | 欧美在线视频观看 | 成人免费视频网站在线观看 | 久久伊人精品一区二区三区 | 成人毛片网站 | 亚洲精品在线免费观看视频 | 欧美一区二区视频 | 在线国产视频 | 亚洲精品视频在线播放 | 中文一区 | 91日韩 | 成人在线一级片 | 岛国毛片在线观看 | 欧美中文字幕一区 | 天天摸天天看 | www.国产.com| 1区2区3区视频 |