欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

淺談C++內(nèi)存管理基礎(chǔ)知識

 更新時間:2021年11月18日 11:29:44   作者:胡代洲  
這篇文章主要為大家介紹了C++的內(nèi)存管理,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助

概述

內(nèi)存管理的原理龐大而復雜,然而這些都被操作系統(tǒng)進行了封裝,并對外預留了API,這些api被c++調(diào)用,同時也被c++再次進行了封裝,再面向程序員預留出了語法特性的接口,作為使用c++的程序員,我們只需要掌握c++預留的內(nèi)存管理特性即可,就像我們開車不需要管變數(shù)箱、發(fā)動機是怎么變速、點火的,我們只需要掌握汽車給我們預留的接口,方向盤、剎車、油門如何使用即可。

c++程序容易出bug,主要就是因為內(nèi)存管理部分的復雜性 ,java、python等語言提供了更多的封裝,所以降低了程序員的操作難度和犯錯的可能。就像自動檔的汽車一樣,沒有了離合,自然就不會因操作失誤把變速箱損壞。

c++可用內(nèi)存

c語言的可用內(nèi)存

在c語言中我們的可用內(nèi)存主要分以下幾個區(qū)域:

  • 棧,用于存放局部變量。
  • 全局數(shù)據(jù)區(qū)/靜態(tài)數(shù)據(jù)區(qū),用于存放全局變量和靜態(tài)局部變量。
  • const數(shù)據(jù)區(qū),該區(qū)域在內(nèi)存中實際是沒有指定分區(qū)的,他存在于全局數(shù)據(jù)區(qū)或者棧中,const不能被修改是被編譯器限制的,在物理內(nèi)存中根本就沒有只讀類型的內(nèi)存。所以有時候我們在討論分區(qū)的時候,不會提到const區(qū),因為他根本就沒有獨立存在。
  • 代碼段,當然是用來存放代碼,在linux下,我們的可執(zhí)行代碼從rom中讀取到內(nèi)存中執(zhí)行,雖說內(nèi)存可讀可寫,但是在操作系統(tǒng)的監(jiān)控下,這段內(nèi)存也是只讀不寫的區(qū)域。
  • 堆,c中的堆由malloc申請,free釋放,底層也是由操作系統(tǒng)提供給我們的程序的一段內(nèi)存。

c++新增內(nèi)存區(qū)域

c中的內(nèi)存分區(qū)在c++中全部都存在,而c++新增了自由存儲區(qū),使用new來申請,delet來釋放,實際和malloc申請的內(nèi)存在一個區(qū)域,new使用內(nèi)存示例如下:

int *p = new int;
*p=6;
cout << "*p=" << *p << endl;
delete p;

new和malloc

linux平臺中new內(nèi)部其實還是通過malooc來申請的內(nèi)存,只是附加做了些其他工作,例如調(diào)用類的構(gòu)造函數(shù)來初始化。malloc返回的就像一塊荒地,需要你自己來規(guī)劃,而new返回的是一個修好基建的區(qū)域給你。

malloc

new

c庫函數(shù)

運算符、關(guān)鍵字

分配空間由傳參決定

大小由數(shù)據(jù)類型決定,編譯器自動計算

返回值void *

明確的類型,申請啥返回啥

free釋放

delete、delet[ ]釋放

申請內(nèi)存不初始化

可以隱式和顯示初始化

無構(gòu)造函數(shù)

執(zhí)行構(gòu)造函數(shù)

申請失敗返回NULL

申請失敗返回bad_alloc異常

智能指針引入

我們說,cpu決定了匯編指令、匯編決定了c和c++,所以c/c++的指針是天然的,用來支持匯編的間接尋址,可以說是cpu決定的指針。所以指針是無法避開的,指針的優(yōu)勢是太靈活,劣勢也是太靈活,尤其是與動態(tài)內(nèi)存、構(gòu)造、析構(gòu)結(jié)合使用后容易出錯,所以c++發(fā)明了一種智能指針,有程序員和專門設(shè)計的自動管理機制共同把控以減少出錯。這種自動管理機制在c中就有體現(xiàn),如棧就是自動管理的結(jié)果。

智能指針是普通指針的升級版,本身具備指針的功能,且多出一些自動釋放資源的機制,當然,智能指針的使用會比普通指針要多消耗一些資源和開銷。在c++中,智能指針不是唯一的,有很多類型的智能指針,各有優(yōu)劣和適應(yīng)的場景。使用智能指針時,須按照設(shè)計,正確使用,否則容易導致災(zāi)難。

智能指針的實現(xiàn)

將普通指針封裝為棧式復合指針對象,內(nèi)部包含了除了真正指向目標的指針外還有些其他東西,如使用次數(shù)記錄等,要使用智能指針,我們需要注意以下問題:

  • 將智能指針本身定義為局部(棧上),實現(xiàn)指針本身被自動回收的。
  • 智能指針內(nèi)部設(shè)計為當指針本身要被彈棧釋放時,執(zhí)行事先掛接好的清理函數(shù),也就是說智能指針內(nèi)部應(yīng)該有一個函數(shù)指針,指向我們的清理函數(shù)。
  • 智能指針需要使用庫為其提供的方法和運算符來重載使用。

java延伸

java語言整體框架

為了保證知識的完整,我們簡單的介紹一下java的內(nèi)容,來了解一些優(yōu)質(zhì)方法。

cpu ->系統(tǒng)內(nèi)核 -> 應(yīng)用層框架 -> java虛擬機 -> Java字節(jié)碼 -> java源碼

從上面的架構(gòu),我們能看出來,java比c/c++多了三層,java的源碼編譯輸出的并不是cpu可執(zhí)行的機器碼,而是被編譯成java字節(jié)碼,這個東西完全是java自己定義的一種東西,只能在JVM(java虛擬機)上運行, JVM再基于一些內(nèi)核提供的框架來運行,所以說java是一種解釋性語言,他完全靠JVM進行解釋,而c/c++是編譯型語言,源碼直接編譯成cpu可執(zhí)行的機器碼。正因為有了JVM,所以java可以跨平臺運行,哪里有JVM哪里就可以運行java,前提是不同平臺的JVM能相互兼容,java的運行穩(wěn)定性取決于JVM。

java的垃圾回收機制

java有一個專門做垃圾回收的守護進程,GC線程,他內(nèi)部使用GC機制和算法來得到生命周期結(jié)束的變量對象,把這些對象當成垃圾進行回收。

實際上垃圾回收并不是java的專利,其他語言,如c#也有類似的設(shè)計理念,典型的就是他們都沒有指針,其垃圾回收機制讓程序員免于考慮對象的生命周期和資源的申請與釋放,使得這門語言非常好學,其實垃圾回收機制的背后都是以效率和內(nèi)存資源為代價,換來的不易出錯,簡單好用。

總結(jié)

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • 深入理解strcpy與memcpy的區(qū)別

    深入理解strcpy與memcpy的區(qū)別

    本篇文章是對strcpy與memcpy的區(qū)別進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • C++動態(tài)規(guī)劃之背包問題解決方法

    C++動態(tài)規(guī)劃之背包問題解決方法

    這篇文章主要介紹了C++動態(tài)規(guī)劃之背包問題解決方法,實例分析了背包問題的原理與C++實現(xiàn)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-04-04
  • Qt圖形圖像開發(fā)之曲線圖表模塊QChart庫一個chart中顯示兩條曲線詳細方法與實例

    Qt圖形圖像開發(fā)之曲線圖表模塊QChart庫一個chart中顯示兩條曲線詳細方法與實例

    這篇文章主要介紹了Qt圖形圖像開發(fā)之曲線圖表模塊QChart庫一個chart中顯示兩條曲線詳細方法與實例,需要的朋友可以參考下
    2020-03-03
  • C++分析講解類的靜態(tài)成員函數(shù)如何使用

    C++分析講解類的靜態(tài)成員函數(shù)如何使用

    與靜態(tài)數(shù)據(jù)成員不同,靜態(tài)成員函數(shù)的作用不是為了對象之間的溝通,而是為了能處理靜態(tài)數(shù)據(jù)成員,靜態(tài)成員函數(shù)沒有this指針。既然它沒有指向某一對象,也就無法對一個對象中的非靜態(tài)成員進行默認訪問
    2022-04-04
  • 一些C語言中字符串的算法問題解決實例小結(jié)

    一些C語言中字符串的算法問題解決實例小結(jié)

    這篇文章主要介紹了一些C語言中字符串的算法問題解決實例小結(jié),包括將字符串轉(zhuǎn)化為int類型的數(shù)及旋轉(zhuǎn)字符串等操作,需要的朋友可以參考下
    2016-03-03
  • C++實現(xiàn)聊天小程序

    C++實現(xiàn)聊天小程序

    這篇文章主要為大家詳細介紹了C++實現(xiàn)聊天小程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • bmp 縮放代碼(BMP位圖任意放大 和縮小)

    bmp 縮放代碼(BMP位圖任意放大 和縮小)

    這篇文章主要介紹了bmp 縮放代碼(BMP位圖任意放大 和縮小),需要的朋友可以參考下
    2016-04-04
  • C++高性能服務(wù)器框架之線程模塊

    C++高性能服務(wù)器框架之線程模塊

    該模塊基于pthread實現(xiàn),sylar說,由于c++11中的thread也是由pthread封裝實現(xiàn)的,并且沒有提供讀寫互斥量,讀寫鎖,自旋鎖等,所以自己封裝了pthread,本文主要詳細介紹了C++高性能服務(wù)器框架中的線程模塊,需要的朋友可以參考下
    2023-06-06
  • 解析c++中的默認operator=操作的詳解

    解析c++中的默認operator=操作的詳解

    本篇文章是對c++中的默認operator=操作的應(yīng)用進行了詳細的分析介紹。需要的朋友參考下
    2013-05-05
  • C++中pair的用法總結(jié)

    C++中pair的用法總結(jié)

    pair是C++STL(標準模板庫)中的一個現(xiàn)有容器,它將2個數(shù)據(jù)整合成一組數(shù)據(jù),當我們類似需求的時候就可以使用到pair,pair的本質(zhì)其實就是個結(jié)構(gòu)體,本文將詳細的給大家介紹pair用法,感興趣的同學可以參考閱讀
    2023-05-05

最新評論