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

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

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

服務器之家 - 編程語言 - C/C++ - C++ 自由存儲區是否等價于堆你知道嗎

C++ 自由存儲區是否等價于堆你知道嗎

2021-12-24 14:45melonstreet C/C++

自由存儲是C++中通過new與delete動態分配和釋放對象的抽象概念,而堆(heap)是C語言和操作系統的術語,是操作系統維護的一塊動態分配內存

free store” VS “heap”

當我問你C++的內存布局時,你大概會回答:

“在C++中,內存區分為5個區,分別是堆、棧、自由存儲區、全局/靜態存儲區、常量存儲區”。

如果我接著問你自由存儲區與堆有什么區別,你或許這樣回答:

“malloc在堆上分配的內存塊,使用free釋放內存,而new所申請的內存則是在自由存儲區上,使用delete來釋放。”

這樣聽起來似乎也沒錯,但如果我接著問:

自由存儲區與堆是兩塊不同的內存區域嗎?它們有可能相同嗎?

你可能就懵了。

事實上,我在網上看的很多博客,劃分自由存儲區與堆的分界線就是new/delete與malloc/free。然而,盡管C++標準沒有要求,但很多編譯器的new/delete都是以malloc/free為基礎來實現的。那么請問:借以malloc實現的new,所申請的內存是在堆上還是在自由存儲區上?

從技術上來說,堆(heap)是C語言和操作系統的術語。堆是操作系統所維護的一塊特殊內存,它提供了動態分配的功能,當運行程序調用malloc()時就會從中分配,稍后調用free可把內存交還。而自由存儲是C++中通過new和delete動態分配和釋放對象的抽象概念,通過new來申請的內存區域可稱為自由存儲區。基本上,所有的C++編譯器默認使用堆來實現自由存儲,也即是缺省的全局運算符new和delete也許會按照malloc和free的方式來被實現,這時藉由new運算符分配的對象,說它在堆上也對,說它在自由存儲區上也正確。但程序員也可以通過重載操作符,改用其他內存來實現自由存儲,例如全局變量做的對象池,這時自由存儲區就區別于堆了。我們所需要記住的就是:

堆是操作系統維護的一塊內存,而自由存儲是C++中通過new與delete動態分配和釋放對象的抽象概念。堆與自由存儲區并不等價。

問題的來源

再回過頭來來看看這個問題的起源在哪里。最先我們使用C語言的時候,并沒有這樣的爭議,很明確地知道malloc/free是在堆上進行內存操作。直到我們在Bjarne Stroustrup的書籍中數次看到free store (自由存儲區),說實話,我一直把自由存儲區等價于堆。而在Herb Sutter的《exceptional C++》中,明確指出了free store(自由存儲區) 與 heap(堆) 是有區別的。關于自由存儲區與堆是否等價的問題討論,大概就是從這里開始的:

Free Store
The free store is one of the two dynamic memory areas, allocated/freed by new/delete. Object lifetime can be less than the time the storage is allocated; that is, free store objects can have memory allocated without being immediately initialized, and can be destroyed without the memory being immediately deallocated. During the period when the storage is allocated but outside the object's lifetime, the storage may be accessed and manipulated through a void* but none of the proto-object's nonstatic members or member functions may be accessed, have their addresses taken, or be otherwise manipulated.

Heap
The heap is the other dynamic memory area, allocated/freed by malloc/free and their variants. Note that while the default global new and delete might be implemented in terms of malloc and free by a particular compiler, the heap is not the same as free store and memory allocated in one area cannot be safely deallocated in the other. Memory allocated from the heap can be used for objects of class type by placement-new construction and explicit destruction. If so used, the notes about free store object lifetime apply similarly here.

來源:http://www.gotw.ca/gotw/009.htm

作者也指出,之所以把堆與自由存儲區要分開來,是因為在C++標準草案中關于這兩種區域是否有聯系的問題一直很謹慎地沒有給予詳細說明,而且特定情況下new和delete是按照malloc和free來實現,或者說是放過來malloc和free是按照new和delete來實現的也沒有定論。這兩種內存區域的運作方式不同、訪問方式不同,所以應該被當成不一樣的東西來使用。

結論

  • 自由存儲是C++中通過new與delete動態分配和釋放對象的抽象概念,而堆(heap)是C語言和操作系統的術語,是操作系統維護的一塊動態分配內存。
  • new所申請的內存區域在C++中稱為自由存儲區。藉由堆實現的自由存儲,可以說new所申請的內存區域在堆上。
  • 堆與自由存儲區還是有區別的,它們并非等價。

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

原文鏈接:https://www.cnblogs.com/QG-whz/p/5060894.html

延伸 · 閱讀

精彩推薦
  • C/C++學習C++編程的必備軟件

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

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

    謝恩銘10102021-05-08
  • C/C++C/C++經典實例之模擬計算器示例代碼

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

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

    jia150610152021-06-07
  • C/C++C語言中炫酷的文件操作實例詳解

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

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

    針眼_6702022-01-24
  • C/C++深入理解goto語句的替代實現方式分析

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

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

    C語言教程網7342020-12-03
  • C/C++詳解c語言中的 strcpy和strncpy字符串函數使用

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

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

    spring-go5642021-07-02
  • C/C++C語言實現電腦關機程序

    C語言實現電腦關機程序

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

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

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

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

    源之緣11542021-10-27
  • C/C++C++之重載 重定義與重寫用法詳解

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

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

    青山的青6062022-01-04
主站蜘蛛池模板: 国产v在线播放 | 无人在线视频高清免费播放 | 午夜福利在线观看6080 | 日本大乳护士的引诱图片 | 天天射夜夜爽 | 香蕉在线精品亚洲第一区 | 喜爱夜蒲2三级做爰 | 国产成人精品免费视频大全五级 | 日韩欧美一级大片 | 青青久久久国产线免观 | 猫扑俩性| 肉车各种play文r | 色漫在线观看 | 午夜DV内射一区区 | 精品午夜视频 | 99视频导航 | www.99精品视频在线播放 | porono日本人xxx| 国产精品99久久久 | 国产在线成人a | 四虎免费影院在线播放 | 亚洲经典 | 欧美精品国产第一区二区 | 色偷偷91久久综合噜噜噜 | 久久免费看少妇高潮A片JA | 国产成人精品日本亚洲网址 | 国模人体aⅴ | 暖暖视频免费观看视频中国.韩剧 | 国产亚洲精品一区二区在线播放 | 日本一区二区精品88 | 贤妻良母电影日本 | jzjzjz日本在线观看 | 日韩在线1| 国产精品久热 | 韩国三级理韩国三级理人伦 | 亚洲国产99999在线精品一区 | 操bb视频| 国产三级精品三级男人的天堂 | 万域之王动漫在线观看全集免费播放 | 国产成人黄网在线免 | 国产激情视频在线 |