《數(shù)據(jù)結(jié)構(gòu),算法與應(yīng)用 C++語言描述》第一章

關(guān)于C++中內(nèi)存分配回收的問題

這些天開始重新學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)與算法相關(guān)的知識,由于在第一章的習(xí)題上面遇到了一些編譯錯誤,進而對C++相關(guān)的知識做了回顧與總結(jié)。

編譯錯誤出現(xiàn)在一個動態(tài)初始化二維數(shù)組的程序中,報錯的內(nèi)容是:pointer being freed was not allocated,簡單翻譯過來就是被回收內(nèi)存的指針并沒有被分配空間;可是我的確是用new關(guān)鍵字來分配空間的,最后找到問題的癥結(jié)是出在main函數(shù)中直接使用int a[SIZE] = {0},C語言的方式創(chuàng)建數(shù)組然后將數(shù)據(jù)名“a”作為參數(shù)傳入函數(shù)中(此處SIZE為常量)。

找到是這個地方出錯,我就先分析了一下,是不是我傳送的數(shù)組指針是常量指針,后來發(fā)現(xiàn)不是這個原因,原因就出在兩種方式分配內(nèi)存的差別:new 分配和類似于int a[SIZE] = {0}的分配方式。這兩種方式有何不同呢?

主要不同在于用new分配的空間是存放在堆中,其在內(nèi)存區(qū)域中的分布是不連續(xù)的,類似于數(shù)據(jù)結(jié)構(gòu)中說的鏈表,該空間需要手動去回收(delete、delete[]),當(dāng)然如果沒有做,最后會由系統(tǒng)來回收,但這就很難說,在此之前會不會出現(xiàn)內(nèi)存泄漏之類的錯誤。而后者是以棧的方式由編譯器自動分配空間的,其回收也是由編譯器自動去回收(當(dāng)此類變量生命周期結(jié)束或離開作用域)。當(dāng)然如果讓我來詳細(xì)說明為什么棧中的空間怎么就不能delete呢?對于這個問題,我現(xiàn)在還不能回答,等我在《深度探索C++對象模型》這本書找到答案,一定會和大家分享的。

當(dāng)然有一點是明確的,當(dāng)你new分配了空間,在你不用的時候,一定要記得delete這是一個好的編程習(xí)慣。

下面是問題代碼:

問題代碼(第一章13題)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • C++運算符重載-下篇 本章內(nèi)容:1. 運算符重載的概述2. 重載算術(shù)運算符3. 重載按位運算符和二元邏輯運算符4...
    Haley_2013閱讀 1,535評論 0 49
  • C語言中內(nèi)存分配 在任何程序設(shè)計環(huán)境及語言中,內(nèi)存管理都十分重要。在目前的計算機系統(tǒng)或嵌入式系統(tǒng)中,內(nèi)存資源仍然是...
    一生信仰閱讀 1,313評論 0 2
  • (JG-2014-08-20)(前半部分經(jīng)過網(wǎng)上多篇文章對比整理)(后半部分根據(jù)ExceptionalCpp、C+...
    JasonGao閱讀 5,740評論 2 23
  • 從三月份找實習(xí)到現(xiàn)在,面了一些公司,掛了不少,但最終還是拿到小米、百度、阿里、京東、新浪、CVTE、樂視家的研發(fā)崗...
    時芥藍(lán)閱讀 42,818評論 11 349
  • 初識文名在課堂, 白洋淀里蘆花揚。 人品如菊有風(fēng)骨, 文韻似水無異芳。 明月清風(fēng)少變幻, 悲歡苦樂多滄桑。 百年樹...
    小林神閱讀 235評論 0 0

友情鏈接更多精彩內(nèi)容