真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

c/c++中如何實現(xiàn)內(nèi)存管理

這篇文章主要為大家展示了“c/c++中如何實現(xiàn)內(nèi)存管理”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學習一下“c/c++中如何實現(xiàn)內(nèi)存管理”這篇文章吧。

成都創(chuàng)新互聯(lián)專注于安順企業(yè)網(wǎng)站建設(shè),自適應(yīng)網(wǎng)站建設(shè),成都商城網(wǎng)站開發(fā)。安順網(wǎng)站建設(shè)公司,為安順等地區(qū)提供建站服務(wù)。全流程按需定制,專業(yè)設(shè)計,全程項目跟蹤,成都創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務(wù)

內(nèi)存區(qū)域:

c/c++中如何實現(xiàn)內(nèi)存管理
由這張圖我們可以看到程序在內(nèi)存中的分布,不同的變量存放在不同的區(qū)域,而內(nèi)核空間是用戶無法進行讀寫的用來存儲有關(guān)的信息。
要注意棧向下生長,堆向上生長,堆棧相對而生,我們今天主要談在堆上申請空間的相關(guān)知識,我們知道在c語言中想要在堆上申請空間需要用到malloc、realloc、calloc這類函數(shù),關(guān)于這些函數(shù)的相同與不同點大家可以參考我的另一篇博客。

在c++中我們用心的關(guān)鍵字 new、delete完成對空間的申請和釋放。語法是也是定義一個指針變量接受開辟的地址,int p=new int;c++允許我們對申請的空間初始化,只要在后面跟上(),()內(nèi)為要初始化的內(nèi)容即可。同時也可以用int p=new int[];的方式申請連續(xù)的內(nèi)存空間,這種方式在釋放時的方式為delete [] p;。

注意:在申請自定義類型時new和malloc是類似的,那么意味著對于內(nèi)置類型free和delete是可以混合使用的,用new申請的空間用free釋放也不會出現(xiàn)什么錯誤,而對于用戶自定義類型new和delete會分別調(diào)用構(gòu)造函數(shù)和析構(gòu)函數(shù),而malloc和free則不會,malloc申請的是與對象大小相同的一塊內(nèi)存空間,是不會構(gòu)成對象的,所以我們在申請和釋放空間時要注意配對!

我們在這里談?wù)刴alloc的原理:我們知道m(xù)alloc申請大小為10個字節(jié)的空間時系統(tǒng)會為我們申請大于十個字節(jié)的空間,大概申請來的空間是長這個樣子滴:
c/c++中如何實現(xiàn)內(nèi)存管理
這也就是我們在free的時候系統(tǒng)會知道free多少個字節(jié),因為在這個類似于結(jié)構(gòu)體的結(jié)構(gòu)內(nèi)最前面已經(jīng)保存了我們申請空間大小的數(shù)值了。

operator new與operator delete函數(shù)

這兩個函數(shù)是new和delete在底層調(diào)用的函數(shù),也就是這兩個函數(shù)為我們完成了內(nèi)存的開辟和釋放。
我們首先看看operator new這個函數(shù):

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);
}

從這個函數(shù)我們可以看到底層也是通過malloc實現(xiàn)的,那么malloc申請成功則直接返回,malloc申請失敗嘗試執(zhí)行空間不足的應(yīng)對措施,執(zhí)行這個措施就會繼續(xù)申請,否則拋出異常。所以new函數(shù)一般都不會申請失敗。

我們再來看operator delete這個函數(shù):

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)的就ok。

我們再看看對于自定義類型new和delete的原理:
new的原理

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

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

  3. 在空間上執(zhí)行析構(gòu)函數(shù),完成對象中資源的清理工作

  4. 調(diào)用operator delete函數(shù)釋放對象的空間
    new T[N]的原理

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

  6. 在申請的空間上執(zhí)行N次構(gòu)造函數(shù)
    delete[]的原理

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

  8. 調(diào)用operator delete[]釋放空間,實際在operator delete[]中調(diào)用operator delete來釋放空間

最后的最后我們再細談一下malloc和new的區(qū)別:
1.new是操作符、malloc是函數(shù)
2.new可以完成對開辟空間的初始化、malloc則不能
3.malloc在使用時需要計算所開辟內(nèi)存的大?。ㄗ止?jié))并傳遞,而new只需跟上類型即可
4.malloc的返回值是void,所以要強制類型轉(zhuǎn)化,new后是類型則不需要。
5.malloc申請失敗會返回NULL,所以要進行判空,new不需要但需要捕獲異常
6.malloc和free不會調(diào)用構(gòu)造和析構(gòu)函數(shù)。

以上是“c/c++中如何實現(xiàn)內(nèi)存管理”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學習更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!


新聞標題:c/c++中如何實現(xiàn)內(nèi)存管理
標題路徑:http://weahome.cn/article/pieeds.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部