一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - C/C++ - 淺談C++內存管理基礎知識

淺談C++內存管理基礎知識

2022-02-25 14:56胡代洲 C/C++

這篇文章主要為大家介紹了C++的內存管理,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助

概述

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

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

c++可用內存

c語言的可用內存

在c語言中我們的可用內存主要分以下幾個區域:

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

c++新增內存區域

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

?
1
2
3
4
int *p = new int;
*p=6;
cout << "*p=" << *p << endl;
delete p;

new和malloc

linux平臺中new內部其實還是通過malooc來申請的內存,只是附加做了些其他工作,例如調用類的構造函數來初始化。malloc返回的就像一塊荒地,需要你自己來規劃,而new返回的是一個修好基建的區域給你。

malloc

new

c庫函數

運算符、關鍵字

分配空間由傳參決定

大小由數據類型決定,編譯器自動計算

返回值void *

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

free釋放

delete、delet[ ]釋放

申請內存不初始化

可以隱式和顯示初始化

無構造函數

執行構造函數

申請失敗返回NULL

申請失敗返回bad_alloc異常

智能指針引入

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

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

智能指針的實現

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

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

java延伸

java語言整體框架

為了保證知識的完整,我們簡單的介紹一下java的內容,來了解一些優質方法。

?
1
cpu ->系統內核 -> 應用層框架 -> java虛擬機 -> Java字節碼 -> java源碼

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

java的垃圾回收機制

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

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

總結

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關注服務器之家的更多內容!

原文鏈接:https://blog.csdn.net/m0_60073820/article/details/121372129

延伸 · 閱讀

精彩推薦
  • C/C++C/C++經典實例之模擬計算器示例代碼

    C/C++經典實例之模擬計算器示例代碼

    最近在看到的一個需求,本以為比較簡單,但花了不少時間,所以下面這篇文章主要給大家介紹了關于C/C++經典實例之模擬計算器的相關資料,文中通過示...

    jia150610152021-06-07
  • C/C++C語言實現電腦關機程序

    C語言實現電腦關機程序

    這篇文章主要為大家詳細介紹了C語言實現電腦關機程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    xiaocaidayong8482021-08-20
  • C/C++c++ 單線程實現同時監聽多個端口

    c++ 單線程實現同時監聽多個端口

    這篇文章主要介紹了c++ 單線程實現同時監聽多個端口的方法,幫助大家更好的理解和學習使用c++,感興趣的朋友可以了解下...

    源之緣11542021-10-27
  • C/C++C語言中炫酷的文件操作實例詳解

    C語言中炫酷的文件操作實例詳解

    內存中的數據都是暫時的,當程序結束時,它們都將丟失,為了永久性的保存大量的數據,C語言提供了對文件的操作,這篇文章主要給大家介紹了關于C語言中文件...

    針眼_6702022-01-24
  • C/C++C++之重載 重定義與重寫用法詳解

    C++之重載 重定義與重寫用法詳解

    這篇文章主要介紹了C++之重載 重定義與重寫用法詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下...

    青山的青6062022-01-04
  • C/C++深入理解goto語句的替代實現方式分析

    深入理解goto語句的替代實現方式分析

    本篇文章是對goto語句的替代實現方式進行了詳細的分析介紹,需要的朋友參考下...

    C語言教程網7342020-12-03
  • C/C++學習C++編程的必備軟件

    學習C++編程的必備軟件

    本文給大家分享的是作者在學習使用C++進行編程的時候所用到的一些常用的軟件,這里推薦給大家...

    謝恩銘10102021-05-08
  • C/C++詳解c語言中的 strcpy和strncpy字符串函數使用

    詳解c語言中的 strcpy和strncpy字符串函數使用

    strcpy 和strcnpy函數是字符串復制函數。接下來通過本文給大家介紹c語言中的strcpy和strncpy字符串函數使用,感興趣的朋友跟隨小編要求看看吧...

    spring-go5642021-07-02
主站蜘蛛池模板: 国产精品天天在线 | 91大神大战高跟丝袜美女 | 99精品观看 | 欧美精品成人a多人在线观看 | 都市风流贵妇激情 | 成人特级毛片69免费观看 | 欧美综合一区二区三区 | 女教师波多野结衣高清在线 | 欧美a一片xxxx片与善交 | 999精品视频这里只有精品 | 鬼惨笑小说 | 亚洲国产精品无码中文字幕 | 狠狠色综合久久婷婷 | 99福利视频导航 | 韩国一大片a毛片女同 | 免费在线看片网站 | 国产日产韩产麻豆1区 | 婷婷色婷婷 | 欧美亚洲影院 | 92国产福利久久青青草原 | 东北疯狂xxxxbbbb中国 | 日韩欧美国产综合精品 | 成人午夜影院在线观看 | 性夜影院爽黄A爽免费动漫 性色欲情网站IWWW九文堂 | 99r在线观看 | 国产精品毛片va一区二区三区 | 5g影院天天影院天天爽影院网站 | 1313午夜精品久久午夜片 | 美女脱了内裤打开腿让男人图片 | 波多野结衣女老师 | 免费视频片在线观看大片 | 精品国产香蕉 | 免费91麻豆精品国产自产在线观看 | 亚洲男gay同性同志 亚洲免费在线看 | 亚洲美女aⅴ久久久91 | 欧美日韩在线观看区一二 | 亚洲 日韩经典 中文字幕 | 久久99re热在线观看视频 | 色老板视频在线观看 | 色呦呦tv | 草草影院永久在线观看 |