国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【C++雜貨鋪】內(nèi)管管理

這篇具有很好參考價值的文章主要介紹了【C++雜貨鋪】內(nèi)管管理。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

【C++雜貨鋪】內(nèi)管管理,C++雜貨鋪,c++,開發(fā)語言,面試,經(jīng)驗分享,c語言,學(xué)習(xí)


目錄

??前言??

?? C/C++中內(nèi)存分布

?? new 和 delete的使用

?? new 和 delete的優(yōu)點

?? new 和 delete的原理

??? operator new 和 operator delete函數(shù)

??? 內(nèi)置類型

??? 自定義類型

?? 內(nèi)存泄漏

?? 總結(jié)


??前言??

? ? ? ? 歡迎收看本期【C++雜貨鋪】,本期內(nèi)容講解C++內(nèi)存管理。包含了C++中內(nèi)存分布情況,如何進行內(nèi)存管理,使用new和delete操作符開辟/釋放空間等,此外將介紹C++中new 和 delete的優(yōu)點和原理。

? ? ? ? 此外,本期內(nèi)容可能會涉及到類和對象的部分概念,如果你還不是很了解,可以快速閱覽以下文章:

【C++雜貨鋪】詳解類和對象 [上]-CSDN博客

【C++雜貨鋪】詳解類和對象 [中]-CSDN博客

【C++雜貨鋪】詳解類和對象 [下]-CSDN博客

【C++雜貨鋪】內(nèi)管管理,C++雜貨鋪,c++,開發(fā)語言,面試,經(jīng)驗分享,c語言,學(xué)習(xí)

?? C/C++中內(nèi)存分布

? ? ? ? 程序運行會被加載到內(nèi)存,程序的代碼和數(shù)據(jù)則會在內(nèi)存中存儲在不同地方,通過內(nèi)存地址進行訪問。

? ? ? ? 內(nèi)存地址是計算機中用來標識存儲單元位置的一個唯一的數(shù)字。在計算機中,每個存儲單元都有一個唯一的地址,通過這些地址可以訪問和操作存儲器中的數(shù)據(jù)。內(nèi)存地址通常用十六進制表示。

? ? ? ? 為了方便管理不同的類型的數(shù)據(jù),如全局變量和局部變量,就會在內(nèi)存中劃分出不同區(qū)域。

當(dāng)然這只是簡單的了解一下內(nèi)存分布,如果你學(xué)過操作系統(tǒng)的內(nèi)容,你就會知道,C/C++中的內(nèi)存概念其實都是虛擬內(nèi)存,不是真實的物理內(nèi)存。

【C++雜貨鋪】內(nèi)管管理,C++雜貨鋪,c++,開發(fā)語言,面試,經(jīng)驗分享,c語言,學(xué)習(xí)

? ? ? ? 上圖中,不同書籍可能會有偏差,如果只學(xué)過語言,只需要知道有棧,堆,數(shù)據(jù)段,代碼段即可。其中棧存放局部變量,形參等數(shù)據(jù),堆則是由程序員自己手動開辟,存放數(shù)據(jù)。

? ? ? ? 所以,堆區(qū)則是我們進行內(nèi)存管理的區(qū)域了。

?? new 和 delete的使用

? ? ? ? 學(xué)過C語言可能知道,想要在C語言中開辟內(nèi)存空間需要使用malloc函數(shù),釋放資源使用free函數(shù)。

? ? ? ? 下圖是malloc和free函數(shù)的使用示例。

開辟1個int類型數(shù)據(jù)的空間
int* pa = (int*)malloc(sizeof(int));
if(pa == NULL )
    return 1;

free(pa);

開辟10個int類型數(shù)據(jù)的空間
int* parr = (int*)malloc(sizeof(int) * 10 );

釋放連續(xù)地址空間只需要給出首元素地址即可
free(parr);

? ? ? ? 我們可以看出使用malloc函數(shù)非常的不方便,例如只開辟空間,不能完成初始化;需要手動判斷內(nèi)存是否開辟成功。

? ? ? ? 此外,最重要的是,對于自定義類型,是需要構(gòu)造函數(shù)初始化,但是malloc開完空間后,不能調(diào)用構(gòu)造函數(shù)。

? ? ? ? 所以C++語言就引入了兩個操作符new 和 delete。

? ? ? ? 下圖是new 和 delete操作符的使用示例。

int* pa = new int;
delete pa;

int* parr = new int[10];
delete[] parr;
? ? ? ? 申請和釋放單個元素的空間,使用 new delete 操作符,申請和釋放連續(xù)的空間,使用 new[] delete[] ,注意:匹配起來使用

【C++雜貨鋪】內(nèi)管管理,C++雜貨鋪,c++,開發(fā)語言,面試,經(jīng)驗分享,c語言,學(xué)習(xí)

?? new 和 delete的優(yōu)點

? ? ? ? 上文中,我們已經(jīng)知道了new 和 delete 操作符的部分優(yōu)點:

1. 編譯器會自動檢查內(nèi)存空間是否成功開辟,如果失敗,則會拋異常。

2. 可以完成初始化的工作。對于自定義類型,會調(diào)用它的構(gòu)造函數(shù)和析構(gòu)函數(shù)。

int* pa = new int(1);

//如果是不完全初始化,后面會用0代替。
int* parr = new int(10){1,2,3,4,5};

?? new 和 delete的原理

? ? ? ? 以上我們簡單了解了new和delete操作符的基本使用,想要徹底掌握,我們就從底層了解new和delete的區(qū)別以及底層實現(xiàn)。

??? operator new 和 operator delete函數(shù)

? ? ? ? new 和 delete是用戶進行動態(tài)內(nèi)存申請和釋放的操作符,operator new 和 operator delete是系統(tǒng)提供的全局函數(shù),new在底層調(diào)用operator new全局函數(shù)來申請空間,delete底層通過operator delete全局函數(shù)來釋放空間

/*
operator new:該函數(shù)實際通過malloc來申請空間,當(dāng)malloc申請空間成功時直接返回;申請空間
失敗,嘗試執(zhí)行空間不足應(yīng)對措施,如果改應(yīng)對措施用戶設(shè)置了,則繼續(xù)申請,否則拋異常。
*/
void *__CRTDECL operator new(size_t size) _THROW1(_STD bad_alloc)
{
// try to allocate size bytes
void *p;
while ((p = malloc(size)) == 0)
? if (_callnewh(size) == 0)
 ? ? {
 ? ? ? ? // report no memory
 ? ? ? ? // 如果申請內(nèi)存失敗了,這里會拋出bad_alloc 類型異常
 ? ? ? ? static const std::bad_alloc nomem;
 ? ? ? ? _RAISE(nomem);
 ? ? }
return (p);
}
/*
operator delete: 該函數(shù)最終是通過free來釋放空間的
*/
void operator delete(void *pUserData)
{
 ? ? _CrtMemBlockHeader * pHead;
 ? ? RTCCALLBACK(_RTC_Free_hook, (pUserData, 0));
 ? ? if (pUserData == NULL)
 ? ? ? ? return;
 ? ? _mlock(_HEAP_LOCK); ?/* block other threads */
 ? ? __TRY
 ? ? ? ? /* get a pointer to memory block header */
 ? ? ? ? pHead = pHdr(pUserData);
 ? ? ? ? ?/* verify block type */
 ? ? ? ? _ASSERTE(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse));
 ? ? ? ? _free_dbg( pUserData, pHead->nBlockUse );
 ? ? __FINALLY
 ? ? ? ? _munlock(_HEAP_LOCK); ?/* release other threads */
 ? ? __END_TRY_FINALLY
 ? ? return;
}
/*
free的實現(xiàn)
*/
#define ? free(p) ? ? ? ? ? ? ? _free_dbg(p, _NORMAL_BLOCK)

? ? ? ? 通過兩個全局函數(shù)的實現(xiàn)就知道了,operator new 實際通過malloc來申請空間,如果malloc申請成功直接返回(原地擴容),否則執(zhí)行用戶提供的空間不足的措施(異地擴容),如果用戶提供改措施,則會繼續(xù)申請,否則拋異常。

?????????operator delete 最終通過free來釋放空間。

??? 內(nèi)置類型

? ? ? ? 如果申請的是內(nèi)置類型的空間(int , double,指針...),new和malloc ,delete和free基本類似,不同之處在于:new 和 delete 是申請和釋放單個元素空間,new[]和delete[]申請的是連續(xù)空間,釋放連續(xù)的空間。而且new申請空間時會拋異常,malloc則會返回NULL。

??? 自定義類型

????????● new的原理

? ? ? ? 1. 調(diào)用operator new函數(shù)申請空間。

? ? ? ? 2. 在申請的空間上執(zhí)行構(gòu)造函數(shù),完成對象的構(gòu)造。

????????● delete的原理

? ? ? ? 1. 在空間上進行析構(gòu)函數(shù),完成對象資源的清理工作。

? ? ? ? 2. 調(diào)用operator delete函數(shù)釋放對象空間。

????????● new[ ]的原理?

? ? ? ? 1. 調(diào)用operator new[ ]函數(shù),在operator new[ ]中實際調(diào)用operator new函數(shù)完成?N個對象空間的申請。

? ? ? ? 2. 在申請空間上調(diào)用N次構(gòu)造函數(shù)。

????????● delete[ ]的原理

? ? ? ? 1. 在釋放對象的空間上進行N次析構(gòu)函數(shù),完成N個對象中資源的清理。

? ? ? ? 2. 調(diào)用operator delete[ ]釋放資源,實際在operator delete[ ]中調(diào)用operator delete[ ]了釋放空間。

?? 內(nèi)存泄漏

????????什么是內(nèi)存泄漏:內(nèi)存泄漏指因為疏忽或錯誤造成程序未能釋放已經(jīng)不再使用的內(nèi)存的情況。內(nèi)存泄漏并不是指內(nèi)存在物理上的消失,而是應(yīng)用程序分配某段內(nèi)存后,因為設(shè)計錯誤,失去了對該段內(nèi)存的控制,因而造成了內(nèi)存的浪費。
????????內(nèi)存泄漏的危害:長期運行的程序出現(xiàn)內(nèi)存泄漏,影響很大,如操作系統(tǒng)、后臺服務(wù)等等,出現(xiàn)內(nèi)存泄漏會導(dǎo)致響應(yīng)越來越慢,最終卡死。

????????

?? 總結(jié)

? ? ? ? 以上,就是本期【C++雜貨鋪】內(nèi)存管理的主要內(nèi)容了,主要介紹了new和delete操作符的使用,有點及其底層原理。

? ? ? ? 此外,簡單介紹了C/C++中內(nèi)存分布情況,以及內(nèi)存泄露的基本概念和危害。

? ? ? ? 如果感覺本期內(nèi)容對你有幫助,歡迎點贊,收藏,關(guān)注Thanks?(?ω?)?

【C++雜貨鋪】內(nèi)管管理,C++雜貨鋪,c++,開發(fā)語言,面試,經(jīng)驗分享,c語言,學(xué)習(xí)文章來源地址http://www.zghlxwxcb.cn/news/detail-850714.html

到了這里,關(guān)于【C++雜貨鋪】內(nèi)管管理的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 【C++雜貨鋪】拷貝構(gòu)造函數(shù)

    【C++雜貨鋪】拷貝構(gòu)造函數(shù)

    ?? 定義 拷貝構(gòu)造函數(shù) 是構(gòu)造函數(shù)的一個重載 ,它的本質(zhì)還是 構(gòu)造函數(shù) ,那就意味著,只有在創(chuàng)建對象的時候,編譯器才會自動調(diào)用它,那他和普通的構(gòu)造函數(shù)有什么區(qū)別呢? 拷貝構(gòu)造函數(shù),是創(chuàng)建對象的時候,用一個已存在的對象,去初始化待創(chuàng)建的對象 。簡單來說,

    2024年02月16日
    瀏覽(20)
  • 【C++雜貨鋪】運算符重載

    【C++雜貨鋪】運算符重載

    本文將以日期類為基礎(chǔ),去探尋運算符重載的特性與使用方法,下面先給出日期類的基礎(chǔ)定義: 備注 :拷貝構(gòu)造函數(shù)和析構(gòu)函數(shù),均可以不寫,因為當(dāng)前日期類的三個成員變量都是內(nèi)置類型,沒有動態(tài)申請空間,使用淺拷貝就可以。 ?? 如何比較兩個日期的大?。?現(xiàn)如今,

    2024年02月16日
    瀏覽(21)
  • 【C++雜貨鋪】缺省參數(shù)、函數(shù)重載

    【C++雜貨鋪】缺省參數(shù)、函數(shù)重載

    ?缺省參數(shù)是 聲明或定義函數(shù)時為函數(shù)的參數(shù)指定一個缺省值 。在調(diào)用該函數(shù)時,如果沒有指定實參則采用該形參的缺省值,否則使用指定的實參。 ?上面代碼在 fun 函數(shù)的形參部分給了缺省值10,這意味著在調(diào)用 fun 函數(shù)的時候可以傳參,也可以不傳參,如果傳參了那形參

    2024年02月16日
    瀏覽(18)
  • 【C++雜貨鋪】詳解list容器

    【C++雜貨鋪】詳解list容器

    目錄 ??前言?? ?? 介紹 ?? 使用 ??? 構(gòu)造 ??? 迭代器iterator ??? capacity ??? modifiers ??? 迭代器失效 ?? 模擬實現(xiàn) ??? 迭代器的實現(xiàn) ?? 代碼展示 ?? 和vector的區(qū)別 ?? 總結(jié) ? ? ? ? 歡迎收看本期【C++雜貨鋪】,本期內(nèi)容將講解STL中關(guān)于list的內(nèi)容,會分為一下幾個方

    2024年04月14日
    瀏覽(22)
  • 【C++雜貨鋪】C++介紹、命名空間、輸入輸出

    【C++雜貨鋪】C++介紹、命名空間、輸入輸出

    ?C語言是 結(jié)構(gòu)化 和 模塊化 的語言,適合處理 較小規(guī)模 的程序。對于復(fù)雜的問題,規(guī)模較大的程序,需要高度的抽象和建模時,C語言則不合適。為了解決軟件危機,20世紀80年代,計算機界提出了 OOP (object oriented programming: 面向?qū)ο?)思想,支持面向?qū)ο蟮某绦蛟O(shè)計語言應(yīng)

    2024年02月16日
    瀏覽(31)
  • 【C++雜貨鋪】再談類和對象

    【C++雜貨鋪】再談類和對象

    在創(chuàng)建對象的時候,編譯器通過調(diào)用構(gòu)造函數(shù),在構(gòu)造函數(shù)體中,給對象中的各個成員變量一個合適的初值。 雖然上述構(gòu)造函數(shù)調(diào)用之后,對象中已經(jīng)有了一個初始值,但是不能將其稱為對對象中成員變量的初始化, 構(gòu)造函數(shù)體中的語句只能將其稱為賦初值,而不能稱作初

    2024年02月16日
    瀏覽(15)
  • 【C++雜貨鋪】初識類和對象

    【C++雜貨鋪】初識類和對象

    ?? 面向過程 C語言是 面向過程的 ,關(guān)注的是過程,分析出求解問題的步驟,通過函數(shù)調(diào)用逐步解決問題。以洗衣服這件事為例,下圖是C語言完成洗衣服這件事的過程。 ?? 面向?qū)ο?C++是 基于面向?qū)ο蟮?,關(guān)注的是對象,將一件事情拆分成不同的對象,靠對象之間的交互完

    2024年02月16日
    瀏覽(23)
  • 【C++雜貨鋪】string使用指南

    【C++雜貨鋪】string使用指南

    2024年02月14日
    瀏覽(21)
  • 【C++雜貨鋪】探索vector的底層實現(xiàn)

    【C++雜貨鋪】探索vector的底層實現(xiàn)

    STL(standard template libaray-標準模板庫): 是C++標準庫的一部分 ,不僅是一個可復(fù)用的組件庫,而且 是一個包羅數(shù)據(jù)結(jié)構(gòu)與算法的軟件框架 。 原始版本 :Alexander Stepanov、Meng Lee在惠普實驗室完成的版本,本著開源精神,它們聲明允許任何人任意運用、拷貝、修改、傳播、商業(yè)使

    2024年02月11日
    瀏覽(24)
  • 【C++雜貨鋪】詳解 stack 和 queue

    【C++雜貨鋪】詳解 stack 和 queue

    ? ? ? ? 歡迎收看本期【C++雜貨鋪】,本期內(nèi)容將講解C++STL中stack和queue的內(nèi)容,其中包含了stack , queue,priority_queue是什么,怎么使用以及模擬實現(xiàn)這些容器。 ? ? ? ? 此外,還將將講解設(shè)計模式中的適配器模式,以及STL中stack,queue的底層deque。 ? ? ? ? stack是一種容器適配

    2024年04月12日
    瀏覽(16)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包