国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

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

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

服務器之家 - 編程語言 - C/C++ - C++內存分布及用法

C++內存分布及用法

2022-03-10 14:42一個熱愛學習的深度渣渣 C/C++

這篇文章主要介紹了C++內存分布及用法,從內存的基礎概念到內存分配進行了講解,內存是我們開發中最重要的一部分,往往邏輯上的錯誤就會造成內存泄漏,導致程序無法運行,下面我們就來了解文章對該內容的詳細介紹

一、內存基礎

1、內存分布

通過下面一張圖看看C++的內存分布:

C++內存分布及用法

棧區:由編譯器自動分配與釋放,存放為程序運行時函數分配的局部變量、函數參數;棧內存分配運算內置于處理器的指令集中,效率很高,但是分配內存的容量有限;

堆區:由newmalloc分配的內存塊,釋放由應用程序控制,不需要編譯器釋放;如果程序員沒有對該內存進行釋放,程序結束后系統自動回收,堆的地方比棧大很多;

靜態區:存放的是static的靜態變量和一些全局變量,特點是只讀、大小固定;靜態變量和全局變量的存儲期是一起的,一旦靜態區的內存被分配,要一直等到程序全部結束后才釋放;

2、棧區與堆區的區別

1、分配方式不同:棧區系統分配系統回收;堆區由程序員手動申請,需要求程序員自行回收,如果沒有回收,系統在程序結束后會進行回收,這種情況會造成內存泄漏;

2、生命周期不同:棧區生命周期是系統分配到系統回收,也就是在大括號內;堆區是從申請到釋放;

3、效率不同:主要原因是地址空間是否連續,棧區地址空間是連續的,效率會高一些;堆區地址空間不連續,需要遍歷鏈表才能找到最近的地址,效率會低一些;

4、內存碎片:堆區容易產生內存碎片,棧區不會;

5、生長方向不同:棧區申請空間的地址(表示地址的八個十六進制數)是從大到小的,堆區申請空間地址是從小到大的。棧區是先進后出的原則,類比棧結構的特點;

  • 棧區特點:更好的局部性,對象自動銷毀;
  • 堆區特點:運行期動態擴展,需要顯示釋放;

注意點:申請的空間是在堆區,變量本身是在棧區!

二、內存分配

1、內存分配方式

可操作的內存分配:

  • 靜態存儲區分配:static靜態變量、全局變量;
  • 棧上分配:局部變量;
  • 堆上分配:newmalloc進行內存分配;

不可操作的內存分配:

內核區、代碼區、局部變量的分配也屬于系統分配;

2、new的用法

C++中通常使用newdelete來構造和銷毀對象;

使用new創建對象,返回的是對象的首地址,需要用指針接收:

?
1
2
int *y = new int(2);
std::cout << *y << std::endl;

對象的構建和銷毀分為兩步:分配內存、所分配內存上構造對象(銷毀與之類似);

new的幾種常見形式:

  • new int(2) :構造單一對象、new int[5]:構造數組;
  • nothrow new:標準庫定義,解決內存分配失敗異常的問題;
  • placement new:使用已經創建的內存,跳過分配內存;
  • new auto

3、delete用法

根據分配的是單一對象還是數組,采用相應的方式銷毀;

?
1
2
int *y = new int[3];
delete[] y;

不能delete一個非new返回的內存(也就是棧內存);
delete nullptr是可被允許的;
同一塊內存不能delete多次;

4、new與malloc的區別

  new不需要指定分配多大,malloc使用的時候必須指定大小;new的底層實現就是malloc,兩者都必須釋放內存,不否則容易造成野指針或內存泄漏。需要注意一點,釋放內存后需設置相關指針為空指針;

總結:

  • 屬性:new為關鍵字(編譯器),malloc是庫函數(需引入頭文件);
  • 參數:new無需指定大小,malloc需指定大小;
  • 返回類型:new返回對象指針,malloc返回void*;
  • 對于自定義的類:new會調用構造和析構函數,malloc不會調用構造和析構函數;
  • 分配失敗:new會拋出異常,malloc會返回空;

5、內存泄漏

是指由于疏忽或錯誤造成程序未能釋放掉不再使用的內存的情況,內存泄漏并非指內存在物理上的小時,而是應用程序分配某段內存后,由于設計錯誤,失去該段內存的控制從而造成內存浪費;

可能的原因:

  • 1、申請后未釋放(最常見)
  • 2、void* 指針的釋放
  • 3、new[] 回收時沒有用delete[] ,數組的回收要注意

三、內存拓展

1、內存概念

  計算機重要部件之一,是外存與CPU進行溝通的橋梁。計算機所有程序都是在內存運行的,因此內存的性能對計算機的影響非常大。內存也稱為內存儲器和主存儲器,作用是暫時存放CPU的運算數據,以及與硬盤等外部存儲器交換的數據;

C++內存分布及用法

尋址空間:保存內存地址的多少,通常我們說的4G內存,就表示計算機能保存2的32次方個地址,也就是能找到這些地址上的二進制信息;

尋址能力:每個地址里能存多少個bit,現在的計算機大多數是16位機器了;

2、虛擬內存

使得系統運行實際的內存空間比想象的大得多,虛擬內存是可以遠大于物理內存的,同時主要為了使程序運行的時候可以不限制于只訪問內存大小,可以通過虛擬內存地址去訪問磁盤空間;

每一個進程虛擬內存都是獨立的,獨立的享有計算機的內存。虛擬內存地址的大小是與地址總線位數相關,物理內存地址的大小是與物理內存條的容量與磁盤容量相關。

四、思考

1、代碼中的b屬于棧區還是堆區?

?
1
2
3
4
void fun()
{
 int *b = new int[14];
}

b是在棧區的變量,由于b是一個局部變量,隨著函數域 的結束被釋放,不需要程序員自行釋放,盡管b使用new進行初始化,還是可以認為分配在棧區;

總結:

本次系統的從內存的基礎概念到內存分配進行了講解,內存是我們開發中最重要的一部分,往往邏輯上的錯誤就會造成內存泄漏,導致程序無法運行。或者一些分配內存的方式不夠細心,也會造成冗余內存的使用。在目前的很多嵌入式板子上,針對內存的接口是必備的,往往也都是基于malloc修改;
還有一點需要注意,不管任何機器上運行程序,操作的都是虛擬內存,內部通過頁表定位到對應的物理內存。關于硬件方面的本質,如果做嵌入式端的話需要深入研究。

到此這篇關于C++內存分布及用法的文章就介紹到這了,更多相關C++內存內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://blog.csdn.net/weixin_40620310/article/details/121754849

延伸 · 閱讀

精彩推薦
  • C/C++詳解c語言中的 strcpy和strncpy字符串函數使用

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

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

    spring-go5642021-07-02
  • C/C++學習C++編程的必備軟件

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

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

    謝恩銘10102021-05-08
  • C/C++C語言中炫酷的文件操作實例詳解

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

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

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

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

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

    青山的青6062022-01-04
  • C/C++C語言實現電腦關機程序

    C語言實現電腦關機程序

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

    xiaocaidayong8482021-08-20
  • C/C++C/C++經典實例之模擬計算器示例代碼

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

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

    jia150610152021-06-07
  • C/C++c++ 單線程實現同時監聽多個端口

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

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

    源之緣11542021-10-27
  • C/C++深入理解goto語句的替代實現方式分析

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

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

    C語言教程網7342020-12-03
主站蜘蛛池模板: 青青青国产精品一区二区 | 国产高清av在线播放 | 欧美一级欧美三级在线观看 | 精品国产精品三级精品av网址 | 欧美日韩高清 | 国产羞羞视频免费在线观看 | 成人高清在线 | 久久久大| 国产精品免费一区二区 | 亚洲成av| 91精品国产91久久综合桃花 | 精品国产精品三级精品av网址 | 成年人在线观看免费视频 | 欧美精品一区二区三区四区在线 | 亚洲精品久久久久久久久久久 | 国产精品一区二区三区免费 | 日韩精品1区 | 国产一级在线观看 | 一级片观看 | 久久中文字幕一区二区三区 | 激情久久免费视频 | 黄色一区二区三区 | 亚洲一区中文字幕在线观看 | 精品无码久久久久久久动漫 | 国产在线观看一区 | 亚洲精品日韩在线 | аⅴ资源新版在线天堂 | 亚洲毛片在线观看 | 亚洲经典一区 | 免费大片黄在线观看 | 亚洲成人高清 | 日狠狠| 亚洲精品专区 | 午夜精品一区二区三区在线视频 | 成人国产精品一级毛片视频 | 免费视频一区 | 91国内在线观看 | 国产中文字幕亚洲 | 午夜av一区二区 | 久久久久久免费毛片精品 | 日韩三区视频 |