0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

C++學(xué)習(xí)筆記之內(nèi)存1

jf_78858299 ? 來(lái)源:阿Q正磚 ? 作者:阿Q正磚 ? 2023-03-17 10:16 ? 次閱讀

整體來(lái)說(shuō),這些內(nèi)容都相當(dāng)基礎(chǔ),對(duì)于大多數(shù)初學(xué)者來(lái)講還是能接受的,在面試日常實(shí)習(xí)、暑期實(shí)習(xí)、校招過(guò)程中還是相當(dāng)有幫助的,對(duì)在校生來(lái)說(shuō)還是相當(dāng)友好滴~

1、內(nèi)存泄漏?怎么解決?

內(nèi)存泄漏是指程序在動(dòng)態(tài)分配內(nèi)存后,未釋放或者未能完全釋放該內(nèi)存空間的情況。這樣會(huì)導(dǎo)致內(nèi)存不斷被占用,進(jìn)而導(dǎo)致程序性能下降、甚至崩潰等問(wèn)題。

解決內(nèi)存泄漏問(wèn)題需要先確定內(nèi)存泄漏的原因,可以通過(guò)以下幾個(gè)步驟來(lái)解決內(nèi)存泄漏問(wèn)題:

  1. 排查代碼:查看代碼中是否有明顯的內(nèi)存泄漏的情況,例如忘記釋放內(nèi)存等。
  2. 使用工具檢查:可以使用一些內(nèi)存泄漏檢測(cè)工具,例如Valgrind、Purify、AddressSanitizer等,來(lái)檢測(cè)程序中的內(nèi)存泄漏情況。
  3. 檢查資源的使用情況:程序中除了內(nèi)存泄漏還可能存在其他資源泄漏,例如文件句柄、網(wǎng)絡(luò)連接等,需要逐一檢查并進(jìn)行相應(yīng)的釋放。
  4. 使用智能指針:在C++中,可以使用智能指針(shared_ptr、unique_ptr、weak_ptr)等RAII技術(shù)來(lái)管理動(dòng)態(tài)內(nèi)存,自動(dòng)釋放資源,避免忘記釋放內(nèi)存的問(wèn)題。
  5. 重構(gòu)代碼:如果程序中的內(nèi)存泄漏問(wèn)題比較嚴(yán)重,無(wú)法通過(guò)以上方法解決,可以考慮對(duì)代碼進(jìn)行重構(gòu),優(yōu)化內(nèi)存使用情況,避免內(nèi)存泄漏的問(wèn)題。

2、說(shuō)說(shuō)常見(jiàn)的內(nèi)存泄漏都有哪些?

  • 對(duì)象被無(wú)意識(shí)地持續(xù)引用:在使用完對(duì)象后,程序沒(méi)有將其引用置為NULL,導(dǎo)致這些對(duì)象一直占用內(nèi)存。
  • 內(nèi)存分配未釋放:程序中使用了動(dòng)態(tài)分配內(nèi)存的函數(shù)(如malloc、calloc、realloc等)分配內(nèi)存,但沒(méi)有調(diào)用free函數(shù)進(jìn)行釋放。
  • 大對(duì)象未分配內(nèi)存池:如果需要頻繁地分配、釋放大對(duì)象(如數(shù)組、矩陣等),直接調(diào)用系統(tǒng)函數(shù)分配內(nèi)存可能會(huì)導(dǎo)致內(nèi)存碎片化,進(jìn)而導(dǎo)致系統(tǒng)內(nèi)存泄漏。此時(shí),可以使用內(nèi)存池技術(shù)來(lái)解決這個(gè)問(wèn)題。
  • 循環(huán)引用:當(dāng)兩個(gè)或多個(gè)對(duì)象之間互相引用時(shí),它們會(huì)互相持有對(duì)方的引用,當(dāng)這些對(duì)象中有一個(gè)引用沒(méi)有被釋放時(shí),將導(dǎo)致內(nèi)存泄漏。
  • 持續(xù)增長(zhǎng)的緩存:當(dāng)一個(gè)緩存區(qū)在使用后沒(méi)有被清空或者不定期的清理,會(huì)導(dǎo)致緩存中的數(shù)據(jù)越來(lái)越多,最終導(dǎo)致內(nèi)存泄漏。

為了解決內(nèi)存泄漏問(wèn)題,需要進(jìn)行內(nèi)存泄漏檢測(cè)和內(nèi)存泄漏排查。一些編程語(yǔ)言和開(kāi)發(fā)工具可以提供內(nèi)存泄漏檢測(cè)的功能,可以通過(guò)這些工具來(lái)查找內(nèi)存泄漏的代碼位置,并及時(shí)修復(fù)。同時(shí),在編寫(xiě)代碼時(shí),也應(yīng)該遵循良好的編程習(xí)慣,及時(shí)釋放已經(jīng)不再使用的內(nèi)存,以避免內(nèi)存泄漏問(wèn)題的出現(xiàn)。

3、如何避免內(nèi)存泄漏?

  • 確保在程序中每次使用完內(nèi)存后及時(shí)釋放,特別是對(duì)于動(dòng)態(tài)分配的內(nèi)存,要在不需要時(shí)及時(shí)釋放。
  • 確保內(nèi)存釋放的正確性,例如使用free函數(shù)時(shí),需要確保傳遞給它的指針是指向動(dòng)態(tài)分配的內(nèi)存空間。
  • 對(duì)于需要長(zhǎng)時(shí)間占用內(nèi)存的程序,可以考慮采用內(nèi)存池技術(shù),動(dòng)態(tài)分配一定數(shù)量的內(nèi)存空間,在使用完成后放回內(nèi)存池中,避免頻繁申請(qǐng)和釋放內(nèi)存造成的性能影響。
  • 對(duì)于需要頻繁申請(qǐng)和釋放內(nèi)存的程序,可以考慮采用內(nèi)存緩存技術(shù),將頻繁使用的內(nèi)存緩存起來(lái),避免頻繁申請(qǐng)和釋放內(nèi)存造成的性能影響。
  • 使用內(nèi)存泄漏檢測(cè)工具,例如Valgrind等,來(lái)幫助檢測(cè)和解決內(nèi)存泄漏問(wèn)題。

4、你知道常見(jiàn)的內(nèi)存錯(cuò)誤嗎?再說(shuō)說(shuō)解決的對(duì)策?

  1. 內(nèi)存泄漏:指已經(jīng)不再需要使用的內(nèi)存沒(méi)有被釋放,導(dǎo)致內(nèi)存浪費(fèi)。解決方案可以采用以下方法:
    1. 手動(dòng)管理內(nèi)存并調(diào)用free()釋放不再使用的內(nèi)存;
    2. 使用智能指針等自動(dòng)內(nèi)存管理機(jī)制;
    3. 使用內(nèi)存泄漏檢測(cè)工具定位和修復(fù)內(nèi)存泄漏問(wèn)題。
  2. 內(nèi)存溢出:指分配的內(nèi)存空間不足以滿足當(dāng)前需要,導(dǎo)致程序崩潰。解決方案可以采用以下方法:
    1. 程序設(shè)計(jì)時(shí)充分考慮內(nèi)存使用情況,合理地規(guī)劃內(nèi)存分配;
    2. 使用內(nèi)存監(jiān)控工具或者操作系統(tǒng)提供的性能工具,監(jiān)測(cè)和分析程序內(nèi)存使用情況;
    3. 優(yōu)化算法或數(shù)據(jù)結(jié)構(gòu),減少內(nèi)存占用。
  3. 野指針:指指針指向了已經(jīng)被釋放的內(nèi)存空間,或者指針未被初始化就被使用。解決方案可以采用以下方法:
    1. 對(duì)指針變量進(jìn)行初始化;
    2. 在指針使用之前,檢查其是否為空或者指向的內(nèi)存是否被釋放;
    3. 使用nullptr代替NULL,避免空指針問(wèn)題;
    4. 使用智能指針等自動(dòng)內(nèi)存管理機(jī)制,避免手動(dòng)釋放內(nèi)存的錯(cuò)誤。

5、詳細(xì)說(shuō)說(shuō)內(nèi)存的分配方式?

內(nèi)存的分配方式有兩種:靜態(tài)內(nèi)存分配和動(dòng)態(tài)內(nèi)存分配。

  1. 靜態(tài)內(nèi)存分配:在程序編譯時(shí)就已經(jīng)分配好內(nèi)存,運(yùn)行時(shí)不能改變分配的內(nèi)存大小,程序執(zhí)行速度快,但是空間利用率低,不能靈活分配內(nèi)存空間。常見(jiàn)的靜態(tài)內(nèi)存分配有:
    1. 全局變量:在程序編譯時(shí)分配內(nèi)存,整個(gè)程序執(zhí)行期間內(nèi)存不釋放。
    2. 靜態(tài)局部變量:在函數(shù)執(zhí)行時(shí)分配內(nèi)存,但是該內(nèi)存空間在函數(shù)執(zhí)行完畢后不釋放,可以用 static 修飾符來(lái)聲明。
    3. 靜態(tài)數(shù)組:在編譯時(shí)就分配內(nèi)存,執(zhí)行期間內(nèi)存不釋放。
    4. 靜態(tài)結(jié)構(gòu)體:在編譯時(shí)就分配內(nèi)存,執(zhí)行期間內(nèi)存不釋放。
  2. 動(dòng)態(tài)內(nèi)存分配:在程序運(yùn)行時(shí)才分配內(nèi)存,可以根據(jù)需要靈活地分配和釋放內(nèi)存空間。常見(jiàn)的動(dòng)態(tài)內(nèi)存分配有:
    1. malloc():在堆上分配指定大小的內(nèi)存空間,返回一個(gè)指向這段內(nèi)存的指針。
    2. calloc():在堆上分配指定數(shù)量和大小的內(nèi)存空間,返回一個(gè)指向這段內(nèi)存的指針。
    3. realloc():調(diào)整已分配內(nèi)存的大小,返回一個(gè)指向這段內(nèi)存的指針。
    4. free():釋放已經(jīng)分配的內(nèi)存。

動(dòng)態(tài)內(nèi)存分配的優(yōu)點(diǎn)是空間利用率高、可以根據(jù)需要靈活地分配和釋放內(nèi)存空間,但是容易引起內(nèi)存泄漏和內(nèi)存碎片問(wèn)題。因此在使用動(dòng)態(tài)內(nèi)存分配時(shí)要注意及時(shí)釋放已經(jīng)不再需要的內(nèi)存空間,避免內(nèi)存泄漏問(wèn)題的發(fā)生。

6、堆和棧的區(qū)別?

棧(stack)是一種先進(jìn)后出(Last In First Out,LIFO)的數(shù)據(jù)結(jié)構(gòu),由編譯器自動(dòng)管理,存放程序的局部變量、函數(shù)參數(shù)和返回地址等信息。棧的內(nèi)存空間由操作系統(tǒng)自動(dòng)分配和釋放,其空間大小是固定的,一般為幾MB至幾十MB。

堆(heap)則是一種動(dòng)態(tài)內(nèi)存分配方式,程序員需要手動(dòng)申請(qǐng)和釋放堆內(nèi)存。堆的內(nèi)存空間由操作系統(tǒng)管理,其大小可以動(dòng)態(tài)增加或減少,一般情況下堆的空間遠(yuǎn)遠(yuǎn)大于棧。

在程序運(yùn)行過(guò)程中,棧的分配和釋放速度較快,但棧的容量有限;堆的分配和釋放速度較慢,但堆的容量較大。因此,對(duì)于較小的數(shù)據(jù)結(jié)構(gòu),優(yōu)先使用棧來(lái)分配內(nèi)存;對(duì)于較大的數(shù)據(jù)結(jié)構(gòu),需要?jiǎng)討B(tài)管理內(nèi)存時(shí),可以使用堆來(lái)分配內(nèi)存。

7、如何控制C++的內(nèi)存分配?

在 C++ 中,可以通過(guò)重載 new 和 delete 運(yùn)算符來(lái)控制內(nèi)存分配。

重載 new 和 delete 運(yùn)算符的方式如下:

void* operator new(size_t size);
void operator delete(void* p) noexcept;

其中,operator new 用于分配內(nèi)存,operator delete 用于釋放內(nèi)存。

默認(rèn)情況下,operator new 調(diào)用 malloc 函數(shù)分配內(nèi)存,operator delete 調(diào)用 free 函數(shù)釋放內(nèi)存。但是,我們可以重載這些運(yùn)算符,自定義內(nèi)存分配和釋放方式。

例如,下面是一個(gè)簡(jiǎn)單的例子,演示如何重載 operator newoperator delete 運(yùn)算符:

#include 


void* operator new(size_t size)
{
    std::cout << "Allocating " << size << " bytes of memory" << std::endl;
    void* p = malloc(size);
    return p;
}


void operator delete(void* p) noexcept
{
    std::cout << "Deallocating memory" << std::endl;
    free(p);
}


int main()
{
    int* ptr = new int;
    delete ptr;
    return 0;
}

運(yùn)行上面的代碼,輸出如下:

Allocating 4 bytes of memory
Deallocating memory

可以看到,重載后的 operator newoperator delete 運(yùn)算符被調(diào)用,并輸出了相關(guān)信息。

通過(guò)重載 operator newoperator delete 運(yùn)算符,我們可以實(shí)現(xiàn)自定義的內(nèi)存分配和釋放方式,從而更好地控制 C++ 的內(nèi)存分配。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 內(nèi)存
    +關(guān)注

    關(guān)注

    8

    文章

    2982

    瀏覽量

    73826
  • 程序
    +關(guān)注

    關(guān)注

    116

    文章

    3766

    瀏覽量

    80770
  • C++
    C++
    +關(guān)注

    關(guān)注

    21

    文章

    2102

    瀏覽量

    73457
  • 編譯
    +關(guān)注

    關(guān)注

    0

    文章

    649

    瀏覽量

    32778
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    C++學(xué)習(xí)筆記之內(nèi)存3

    內(nèi)存泄漏是指程序在動(dòng)態(tài)分配內(nèi)存后,未釋放或者未能完全釋放該內(nèi)存空間的情況。這樣會(huì)導(dǎo)致內(nèi)存不斷被占用,進(jìn)而導(dǎo)致程序性能下降、甚至崩潰等問(wèn)題。
    的頭像 發(fā)表于 03-17 10:15 ?1023次閱讀

    C++學(xué)習(xí)筆記之內(nèi)存2

    內(nèi)存泄漏是指程序在動(dòng)態(tài)分配內(nèi)存后,未釋放或者未能完全釋放該內(nèi)存空間的情況。這樣會(huì)導(dǎo)致內(nèi)存不斷被占用,進(jìn)而導(dǎo)致程序性能下降、甚至崩潰等問(wèn)題。
    的頭像 發(fā)表于 03-17 10:16 ?1079次閱讀

    如何學(xué)習(xí)C++,如何學(xué)好C++

    最近,很多學(xué)員都給我發(fā)郵件問(wèn)我應(yīng)該如何學(xué)習(xí)C++,如何學(xué)好C++?那么作為一個(gè)從C語(yǔ)言小白摸爬滾打、入坑無(wú)數(shù)到成長(zhǎng)為如今的高級(jí)C++游戲開(kāi)發(fā)
    發(fā)表于 08-20 06:27

    學(xué)習(xí)C++的方法以及C++的就業(yè)方向

    學(xué)習(xí)方向:嵌入式+人工智能嵌入式是一門(mén)技術(shù)學(xué)習(xí)目標(biāo)1.嵌入式開(kāi)發(fā)概述;(面向?qū)ο笤谇度胧介_(kāi)發(fā)中角色)2.嵌入式Linux C++編程;(C++
    發(fā)表于 12-24 07:32

    C++內(nèi)存泄漏

    C++內(nèi)存分配與釋放均由用戶代碼自行控制,靈活的機(jī)制有如潘多拉之盒,即讓程序員有了更廣的發(fā)揮空間,也產(chǎn)生了代代相傳的內(nèi)存泄漏問(wèn)題。對(duì)于新手來(lái)說(shuō),最常
    發(fā)表于 09-15 17:39 ?16次下載

    CC++學(xué)習(xí)過(guò)程總結(jié)

      總是被同學(xué)們問(wèn)到,如何學(xué)習(xí)CC++才不茫然,才不是亂學(xué),想了一下,這里給出一個(gè)總的回復(fù)。   一家之言,歡迎拍磚哈。   1、可以考慮先學(xué)
    發(fā)表于 09-10 11:42 ?1235次閱讀

    程序設(shè)計(jì)之內(nèi)存管理

    使用C語(yǔ)言編程時(shí),關(guān)于程序設(shè)計(jì)之內(nèi)存管理。
    發(fā)表于 05-20 17:01 ?0次下載

    C++語(yǔ)言學(xué)習(xí)提綱

    C++語(yǔ)言學(xué)習(xí)提綱
    發(fā)表于 12-30 14:50 ?0次下載

    C++“指針”學(xué)習(xí)建議

    C++“指針”學(xué)習(xí)建議
    發(fā)表于 03-31 15:53 ?3次下載

    C++內(nèi)存泄漏分析方法

    C++是一種非常流行的計(jì)算機(jī)編程語(yǔ)言,在使用的過(guò)程中容易出現(xiàn)內(nèi)存泄漏問(wèn)題,而該問(wèn)題往往難以識(shí)別。給出了一種對(duì)C++內(nèi)存泄漏問(wèn)題進(jìn)行分析的方法,該方法得到
    發(fā)表于 11-23 11:19 ?5次下載
    <b class='flag-5'>C++</b><b class='flag-5'>內(nèi)存</b>泄漏分析方法

    嵌入式系統(tǒng)編程之內(nèi)存操作學(xué)習(xí)

    嵌入式系統(tǒng)編程之內(nèi)存操作學(xué)習(xí) 1.數(shù)據(jù)指針 在嵌入式系統(tǒng)的編程中,常常要求在特定的內(nèi)存單元讀寫(xiě)內(nèi)容,匯編有對(duì)應(yīng)的MOV指令,而除C/
    發(fā)表于 09-08 18:11 ?344次閱讀

    C++內(nèi)存管理技術(shù)的詳細(xì)資料說(shuō)明

    內(nèi)存管理是C++最令人切齒痛恨的問(wèn)題,也是C++最有爭(zhēng)議的問(wèn)題,C++高手從中獲得了更好的性能,更大的自由,c++菜鳥(niǎo)的收獲則是一遍一遍的檢
    發(fā)表于 03-14 08:00 ?4次下載

    Linux C/C++ 學(xué)習(xí)路線

    一、秋招 Linux C/C++ offer 情況二、Linux C/C++ 方向的一些思考三、計(jì)算機(jī)基礎(chǔ)知識(shí)的梳理四、C++ 方向的深入
    發(fā)表于 11-06 19:36 ?14次下載
    Linux <b class='flag-5'>C</b>/<b class='flag-5'>C++</b> <b class='flag-5'>學(xué)習(xí)</b>路線

    C++學(xué)習(xí)筆記c++的基本認(rèn)識(shí)

    自這篇文章我們即將開(kāi)始C++的奇幻之旅,其內(nèi)容主要是讀C++ Primer的總結(jié)和筆記,有興趣可以找原版書(shū)看看,對(duì)于學(xué)習(xí)C++還是有很大幫助
    的頭像 發(fā)表于 03-17 13:57 ?692次閱讀

    C++內(nèi)存管理問(wèn)題

    寫(xiě)服務(wù)端的,內(nèi)存是一個(gè)繞不過(guò)的問(wèn)題,而用C++寫(xiě)的,這個(gè)問(wèn)題就顯得更嚴(yán)重。進(jìn)程的內(nèi)存持續(xù)上漲,有可能是正常的內(nèi)存占用,也有可能是內(nèi)存碎片,而
    的頭像 發(fā)表于 11-13 11:13 ?605次閱讀
    <b class='flag-5'>C++</b><b class='flag-5'>內(nèi)存</b>管理問(wèn)題