最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

基于C++中常見(jiàn)內(nèi)存錯(cuò)誤的總結(jié)

 更新時(shí)間:2013年05月16日 10:12:21   作者:  
本篇文章是對(duì)C++中常見(jiàn)的內(nèi)存錯(cuò)誤進(jìn)行了總結(jié)介紹。需要的朋友參考下

在系統(tǒng)開(kāi)發(fā)過(guò)程中出現(xiàn)的bug相對(duì)而言是比較好解決的,花費(fèi)在這個(gè)上面的調(diào)試代價(jià)不是很大,但是在系統(tǒng)集成后的bug往往是難以定位的bug(最好方式是打樁,通過(guò)打樁可以初步鎖定出錯(cuò)的位置,如:進(jìn)入函數(shù)前打印日志,離開(kāi)時(shí)再次打印日志)。而這些難以定位的bug基本分為2類(lèi):內(nèi)存錯(cuò)誤和并非問(wèn)題。

1、內(nèi)存泄露
如果在堆棧上分配的內(nèi)存使用完成后沒(méi)有釋放就會(huì)造成內(nèi)存泄露。少量的內(nèi)存泄露不至于讓程序崩潰,但是大量的內(nèi)存泄露就會(huì)導(dǎo)致內(nèi)存耗盡,后續(xù)內(nèi)存分配失敗,從而導(dǎo)致程序崩潰。長(zhǎng)時(shí)間運(yùn)行軟件,即使只有一兩處泄露,同樣會(huì)導(dǎo)致程序崩潰。所以有當(dāng)出現(xiàn)內(nèi)存泄露請(qǐng)檢查是否釋放了資源。

2、內(nèi)存越界訪(fǎng)問(wèn)
內(nèi)存越界訪(fǎng)問(wèn)有兩種:一種是讀越界,即讀了不屬于自己的數(shù)據(jù),如果所讀的內(nèi)存地址是無(wú)效的,程序就立即崩潰。如果所讀的內(nèi)存地址是有效的,在讀的時(shí)候不會(huì)出現(xiàn)問(wèn)題,但是由于讀到的數(shù)據(jù)是隨機(jī)的,他會(huì)產(chǎn)生不可預(yù)料的后果,另一種是寫(xiě)越界,又叫緩沖區(qū)溢出。所寫(xiě)的數(shù)據(jù)是隨機(jī)的,他也會(huì)產(chǎn)生不可預(yù)料的后果。

內(nèi)存越界訪(fǎng)問(wèn)造成的后果非常嚴(yán)重,是引起程序不穩(wěn)定的主要原因之一,最主要的是它造成的后果是隨機(jī)的,表現(xiàn)出來(lái)的癥狀和時(shí)機(jī)也是隨機(jī)的,讓bug的現(xiàn)象和本質(zhì)看似沒(méi)有什么聯(lián)系,這給bug定位帶來(lái)了極大的困難。所以在時(shí)機(jī)開(kāi)發(fā)過(guò)程中,對(duì)于外部傳入的參數(shù)要仔細(xì)檢查。

3、野指針
釋放掉的內(nèi)存會(huì)被內(nèi)存管理器重新分配。此時(shí)野指針指向的內(nèi)存已經(jīng)被賦予新的意義。對(duì)野指針指向的內(nèi)存訪(fǎng)問(wèn),無(wú)論是有意的還是無(wú)意的,都會(huì)為此付出巨大代價(jià),因?yàn)樗斐傻暮蠊?,如果越界訪(fǎng)問(wèn)一樣是不可預(yù)料的。解決野指針最好的方法:釋放內(nèi)存后立即把對(duì)應(yīng)指針置為空值。

4、訪(fǎng)問(wèn)空指針
在訪(fǎng)問(wèn)指針指向的內(nèi)存時(shí),確保指針不是空指針。訪(fǎng)問(wèn)空指針指向的內(nèi)存,通常會(huì)導(dǎo)致程序崩潰,或者不可預(yù)料的錯(cuò)誤。

5、引用未初始化的變量
未初始化變量的內(nèi)容是隨機(jī)的,使用這些數(shù)據(jù)會(huì)造成不可預(yù)料的后果,調(diào)試這樣的bug也非常困難。最好的解決辦法:在聲明變量的時(shí)候就對(duì)它進(jìn)行初始化。

6、不清楚的指針運(yùn)算
如:int *p=....;
p+n等價(jià)于(size_t)p+n*sizeof(*p);

7、結(jié)構(gòu)體成員順序變化引發(fā)的錯(cuò)誤

8、結(jié)構(gòu)體大小變化引發(fā)的錯(cuò)誤

9、分配釋放不配對(duì)

10、返回指向臨時(shí)變量的指針
棧里面的變量時(shí)臨時(shí)的,當(dāng)前函數(shù)執(zhí)行完成時(shí),先關(guān)的臨時(shí)變量和參數(shù)都被清除了。不能把指向這些臨時(shí)變量的指針?lè)祷亟o調(diào)用這,這樣的指針執(zhí)行的數(shù)據(jù)是隨機(jī)的,會(huì)給程序造成不可預(yù)料的后果。

11、試圖修改常量
如:char *p="1234";
*p='1';

12、誤解傳值和傳引用

13、重名符號(hào)
關(guān)于重名問(wèn)題可以參考:C++重定義解決方法總結(jié)

14、棧溢出

15、誤用sizeof
C++通常是按值傳遞參數(shù),而數(shù)組則是例外,在傳遞數(shù)組參數(shù)時(shí),數(shù)組退化為指針(及按引用傳遞),此時(shí)用sizeof是無(wú)法獲取數(shù)據(jù)的大小。

16、字節(jié)對(duì)齊
字節(jié)對(duì)齊主要目的是提高內(nèi)存訪(fǎng)問(wèn)效率,在某些平臺(tái)上,就不僅僅是效率問(wèn)題,如果不對(duì)齊得到的數(shù)據(jù)是錯(cuò)誤的。大多數(shù)情況下編譯器會(huì)保值全局變量和臨時(shí)變量按照正確的方式對(duì)齊。內(nèi)存管理器會(huì)保證動(dòng)態(tài)按照正確的方式對(duì)齊。要注意的是:在不同的類(lèi)型的變量之間轉(zhuǎn)換時(shí)要小心。
字節(jié)對(duì)齊也會(huì)造成結(jié)構(gòu)體大小的變化,在程序內(nèi)部用sizeof來(lái)取的結(jié)構(gòu)的大小就可以了。若數(shù)據(jù)要在不同的機(jī)器間傳遞時(shí),在通信協(xié)議中要規(guī)定對(duì)齊的方式,避免對(duì)齊方式不一致引發(fā)的問(wèn)題。
關(guān)于字節(jié)對(duì)齊問(wèn)題請(qǐng)參考:關(guān)于C++內(nèi)存中字節(jié)對(duì)齊問(wèn)題的詳細(xì)介紹

17、字節(jié)順序
字節(jié)順序歷來(lái)是設(shè)計(jì)跨平臺(tái)最頭痛的問(wèn)題。字節(jié)順序是關(guān)于數(shù)據(jù)在物理內(nèi)存中的布局問(wèn)題,最常見(jiàn)的字節(jié)順序有兩種:大端模式和小端模式
大端模式:高位字節(jié)數(shù)據(jù)存放在低地址處,低位字節(jié)數(shù)據(jù)存放在高地址處。
小端模式:低位字節(jié)數(shù)據(jù)存放在內(nèi)存低地址處,高字節(jié)字節(jié)數(shù)據(jù)存放在內(nèi)存高地址處

如:long n=0x11223344
模式第1字節(jié) 第2字節(jié)第3字節(jié)  第4字節(jié)
大端模式0x110x220x330x44
小端模式0x440x330x220x11

在普通軟件中,字節(jié)順序問(wèn)題并不引人注目。而在開(kāi)發(fā)與網(wǎng)絡(luò)通信和數(shù)據(jù)交換有關(guān)的軟件時(shí),字節(jié)順序就要多注意了。

18、多線(xiàn)程共享變量沒(méi)有用valotile修飾
valotile作用:告訴編譯器不要把變量?jī)?yōu)化到寄存器中。在開(kāi)發(fā)多線(xiàn)程的程序是,如果這些線(xiàn)程共享一些全局變量,這些全局變量最好使用valotile修飾。這樣可以避免因?yàn)榫幾g器優(yōu)化而引起的錯(cuò)誤。

相關(guān)文章

  • C++?Boost?Xpressive示例分析使用

    C++?Boost?Xpressive示例分析使用

    Boost是為C++語(yǔ)言標(biāo)準(zhǔn)庫(kù)提供擴(kuò)展的一些C++程序庫(kù)的總稱(chēng)。Boost庫(kù)是一個(gè)可移植、提供源代碼的C++庫(kù),作為標(biāo)準(zhǔn)庫(kù)的后備,是C++標(biāo)準(zhǔn)化進(jìn)程的開(kāi)發(fā)引擎之一,是為C++語(yǔ)言標(biāo)準(zhǔn)庫(kù)提供擴(kuò)展的一些C++程序庫(kù)的總稱(chēng)
    2022-11-11
  • 淺析C++內(nèi)存布局

    淺析C++內(nèi)存布局

    本文給大家介紹了C++內(nèi)存布局的相關(guān)知識(shí),通過(guò)進(jìn)程間通信比線(xiàn)程間通信難也是因?yàn)檫M(jìn)程間的用戶(hù)空間是相互隔離的,無(wú)法相互訪(fǎng)問(wèn),需要通過(guò)進(jìn)程間通信方式通信,通過(guò)內(nèi)核地址空間
    2021-10-10
  • C/C++ 中extern關(guān)鍵字詳解

    C/C++ 中extern關(guān)鍵字詳解

    這篇文章主要介紹了C/C++ 中extern關(guān)鍵字詳解的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • 一篇文章了解c++中的new和delete

    一篇文章了解c++中的new和delete

    C語(yǔ)言提供了malloc和free兩個(gè)系統(tǒng)函數(shù),完成對(duì)堆內(nèi)存的申請(qǐng)和釋放,而C++則提供了兩個(gè)關(guān)鍵字new和delete,下面這篇文章主要給大家介紹了如何通過(guò)一篇文章了解c++中new和delete的相關(guān)資料,需要的朋友可以參考下
    2021-12-12
  • C++實(shí)現(xiàn)鏈表版本通訊錄

    C++實(shí)現(xiàn)鏈表版本通訊錄

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)鏈表版本通訊錄,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • 淺析C++11新特性的Lambda表達(dá)式

    淺析C++11新特性的Lambda表達(dá)式

    C++11 新增了很多特性,lambda 表達(dá)式是其中之一,本文涉及到C++11這次更新中較為重要的lambda表達(dá)式。有需要的朋友們可以參考學(xué)習(xí)。
    2016-08-08
  • Qt打印信息輸出到日志文件中的兩種方法

    Qt打印信息輸出到日志文件中的兩種方法

    最近在研究把?Qt?的打印信息?輸出的到日志文件中,文件存儲(chǔ)嘗試了2種方法,并通過(guò)代碼示例和圖文給大家介紹的非常詳細(xì),具有一定的參考價(jià)值,需要的朋友可以參考下
    2024-04-04
  • C++文件關(guān)鍵詞快速定位出現(xiàn)的行號(hào)實(shí)現(xiàn)高效搜索

    C++文件關(guān)鍵詞快速定位出現(xiàn)的行號(hào)實(shí)現(xiàn)高效搜索

    這篇文章主要為大家介紹了C++文件關(guān)鍵詞快速定位出現(xiàn)的行號(hào)實(shí)現(xiàn)高效搜索,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10
  • QT6安裝圖文教程(兼容QT5、QT4)

    QT6安裝圖文教程(兼容QT5、QT4)

    本文主要介紹了QT6安裝圖文教程(兼容QT5、QT4),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • C語(yǔ)言實(shí)現(xiàn)將double/float 轉(zhuǎn)為字符串(帶自定義精度)

    C語(yǔ)言實(shí)現(xiàn)將double/float 轉(zhuǎn)為字符串(帶自定義精度)

    這篇文章主要介紹了C語(yǔ)言實(shí)現(xiàn)將double/float 轉(zhuǎn)為字符串(帶自定義精度),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12

最新評(píng)論

屏东县| 桂东县| 黄陵县| 托克托县| 林口县| 临沭县| 西吉县| 孝感市| 通江县| 金溪县| 锦州市| 柘荣县| 温宿县| 永新县| 广灵县| 巴里| 德州市| 崇礼县| 田阳县| 光山县| 永修县| 新野县| 大洼县| 双牌县| 镇巴县| 棋牌| 阿坝| 汕尾市| 安远县| 贞丰县| 宁夏| 昌吉市| 华宁县| 米泉市| 江城| 桃源县| 龙江县| 沙洋县| 新化县| 南阳市| 林芝县|