【C語言】常見的動態內存的錯誤

前言

在動態內存函數的使用過程中我們可能會遇到一些錯誤,這里將常見的錯誤進行總結。

對NULL解引用

請看以下代碼:

可以看到,這時我們的malloc開辟是失敗的,所以返回的是空指針NULL,而我們卻沒有進行檢查,而是直接對其解引用,最終想要打印這塊內存的內容,也是失敗的。

這里的下波浪線是vs給出的沒有進行檢查的警告,即使malloc申請的空間沒有那么大可以成功申請,最終也能正常打印,這個警告依然會存在

總之,就是不要忘記檢查返回值是否為NULL。

對動態開辟空間的越界訪問

動態開辟的空間也有自己的大小,所以也有越界。

可以看到,此時vs很智能地給出了警告。?

對非動態開辟內存使用free釋放

int main()
{int a = 2077;int* p = &a;free(p);p = NULL;return 0;
}

這段代碼中,p指向的明明不是動態開辟來的空間,卻對它進行free,會發生什么呢?

可以看到會出現這樣的后果。(動態內存相關的錯誤常見現象)

?

使用free釋放動態開辟內存的一部分

我們知道,如果用*(p+i),在訪問數組的過程中,i在改變,但p始終沒有改變。

int* p = (int*)malloc(10*sizeof(int));
if (p == NULL)
{perror("malloc");return 1;
}int i = 0;
for(i=0;i<5;i++)
{*(p+i)=i;
}free(p);
p=NULL;

而我們還有另一種移動指針的寫法:

int* p = (int*)malloc(10*sizeof(int));
if (p == NULL)
{perror("malloc");return 1;
}int i = 0;
for(i=0;i<5;i++)
{*p=i;p++;
}free(p);
p=NULL;

在這種寫法中,p自身發生了改變。當退出循環時,由于p++,此時我們的p指向的是第6個元素(數組只有5個元素)。所以我們的p現在不指向動態開辟內存的起始位置。而使用free必須是傳起始地址。

所以,我們不應該讓p亂動

對同一塊動態內存多次釋放

如果是這樣的多次釋放:

free(p);
p = NULL;free(p);
p = NULL;

這倒是沒什么問題,因為前面已經把p置為NULL了,而對NULL進行釋放會什么都不做。

但如果是這樣的多次釋放,就會有問題:

free(p);free(p);
p = NULL;

因為我們并沒有把p置為NULL,那么此時p成為了野指針,我們對野指針進行釋放,這是有問題的。

所以又可以再次看出,將p釋放后及時置為NULL的重要性。

動態開辟內存忘記釋放(內存泄漏)

這是各類問題中相當令人頭疼的一個。開辟了內存,也使用了,但是忘記釋放了。

比如,我們在調用free()之前寫了會提前返回的代碼(這是很有可能發生的):

void test()
{int flag = 1;int* p = (int*)malloc(100);if (p == NULL){return;}//假設這里使用了這塊內存if (flag)//假設某個條件發生了,就提前返回return;free(p);p=NULL;
}int main()
{test();//假設這里還有很多代碼return 0;
}

所以這時,我們開辟來的這塊空間沒有機會釋放了。

而且從test回到主函數后,還有很多代碼,已經找不回這塊空間了,也就是內存泄漏了。

只有等到主函數徹底結束,這塊空間才會回收。

內存泄漏指的是一塊空間動態開辟后,使用完又不釋放,也可能再沒法釋放,這塊空間就相當于消失或者說泄漏了。

所以可以看到,即使我們的malloc和free已經成對使用了,也有可能出現無法釋放的情況,這樣的內存泄漏的問題必須在寫代碼時小心,在出問題時也得慢慢去查。

(如果想讓后面的程序去釋放,那就要把指針返回給后面的程序)

?內存泄漏有多可怕呢,比如一些服務器程序,24/7,一直在運行,如果內存泄漏,一會吃掉一點內存,可能就把內存耗干了,機器就掛了。

總結

動態內存是一把雙刃劍,能夠提供靈活的內存管理方式,同時也會帶來風險。

到此,本文就結束了,祝閱讀愉快^_^

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/19729.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/19729.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/19729.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

推薦:4本易發表的優質SSCI期刊,含期刊官網!

01、Risk Management and Healthcare Policy 開源四區&#xff0c;國人發表占比25%&#xff0c;發表量前三的國家分別是中國、埃塞俄比亞和美國。 該期刊對國人友好&#xff0c;年度發文量400多&#xff0c;影響因子3.6。 主要刊發公共衛生相關的文章。 研究者可以圍繞居民…

【C++ C#】 C++ 和C# 的混合項目,C++ 文件中有多個 函數和變量 定義了未使用,會影響程序正常執速度嗎?

文章目錄 1 未使用的函數和變量 是否會影響速度分析1.1 C 未使用的函數和變量&#xff1a;1.2 C# 未使用的函數和變量&#xff1a; 2 影響程序執行速度的其他因素3 如何處理未使用的代碼 一個 C 和C# 的混合項目&#xff0c;C 文件中有多個 函數和變量 定義了未使用&#xff0c…

推薦系統三十六式學習筆記:01|你真的需要個性化推薦系統嗎?

目錄 什么是推薦系統你需要推薦系統嗎總結 什么是推薦系統 讓我們來換一個角度回答三個問題&#xff0c;從而重新定義什么是推薦系統: 1、它能做什么&#xff1f; 2、它需要什么&#xff1f; 3、它怎么做。 對于第一個問題“它能做什么”&#xff0c;我的回答是&#xff1a;推…

2020年CSP-J入門級第一輪初賽真題

一、選擇題 在內存儲器中每個存儲單元都被賦予一個唯一的序號&#xff0c;稱為&#xff08;&#xff09;。 A.地址 B. 序號 C. 下標 D. 編號 答案&#xff1a;A. 地址 在內存儲器中&#xff0c;每個存儲單元都有一個唯一的標識&#xff0c;用于區分和訪問不同的存儲單元。這個唯…

說說你對單例模式的理解?如何實現?

一、是什么 單例模式&#xff08;Singleton Pattern&#xff09;&#xff1a;創建型模式&#xff0c;提供了一種創建對象的最佳方式&#xff0c;這種模式涉及到一個單一的類&#xff0c;該類負責創建自己的對象&#xff0c;同時確保只有單個對象被創建 在應用程序運行期間&am…

day23--單元測試-反射-注解-動態代理

day23-單元測試、反射 恭喜同學們&#xff0c;Java主要的知識我們其實已經學習得差不多了。今天同學們再把單元測試、反射、注解、動態代理學習完。Java的基礎知識就算全齊活了。 首先&#xff0c;我們進入單元測試的學習。 一、單元測試 1.1 單元測試快速入門 所謂單元測…

北斗消防系統實現林海無信號應急通信,高效防災救災開拓應急救援新通道

最近&#xff0c;貴州多地爆發的重大山火&#xff0c;火勢 21日這12天里&#xff0c;貴州發生森林火情221起&#xff0c;當地包括武警、消防、專業救援隊伍等在內的9千多人連續撲救&#xff0c;1.5萬名基層黨員干部、民兵、群眾及志愿者協助救火。目前&#xff0c;貴州全省火災…

OSPF狀態機+SPF算法

OSPF狀態機 1.點到點網絡類型 down-->init-->(前提為可以建立鄰接)exstart——>exchange-->若查看鄰接的DBD 目錄后發現不用進行LSA 直接進入ful。若查看后需要進行查詢、應答先進入loading&#xff0c;在查詢應答完后再進入 fuIl: 2.MA網絡類型 down --&g…

【計算機網絡】——概述(圖文并茂)

概述 一.信息時代的計算機網絡二.互聯網概述1.網絡&#xff0c;互連網&#xff0c;互聯網&#xff08;因特網&#xff09;1.網絡2.互連網3.互聯網&#xff08;因特網&#xff09; 2.互聯網簡介1.互聯網發展的三個階段2.互聯網服務提供者&#xff08;ISP&#xff09;3.互聯網的組…

HTTP/超文本傳輸協議(Hypertext Transfer Protocol)及HTTP協議通信步驟介紹和請求、響應階段詳解;

目錄 一、HTTP/超文本傳輸協議 特點和功能 請求-響應模型 版本和擴展 安全性和加密 二、HTTP協議通信步驟介紹 三、請求、響應階段詳解 HTTP請求 HTTP響應 示例 一、HTTP/超文本傳輸協議 HTTP/超文本傳輸協議&#xff08;Hypertext Transfer Protocol&#xff09;是…

淺談人機交互

人機交互&#xff08;Human-Computer Interaction&#xff0c;HCI&#xff09;&#xff0c;是指關于設計、評價和實現供人們使用的交互式計算機系統&#xff0c;并圍繞相關的主要現象進行研究。 狹義的講&#xff0c;人機交互技術主要是研究人與計算機之間的信息交換&#xff0…

wpf窗體背景鏡像漸變效果實現

<Window.Background> <!--鏡像漸變--> <RadialGradientBrush Center"0.5,0" GradientOrigin"0.5,-0.5" RadiusX"0.7" RadiusY"1.2"> <GradientStop Color"#ff61baff" Offset"0&q…

【康耐視國產案例】智能AI相機:深度解析DataMan 380大視野高速AI讀碼硬實力

隨著讀碼器技術的不斷更新迭代&#xff0c;大視野高速應用成為當前工業讀碼領域的關鍵發展方向。客戶對大視野高速讀碼器的需求源于其能顯著減少生產成本并提升工作效率。然而&#xff0c;大視野應用場景往往伴隨著對多個條碼的讀取需求&#xff0c;這無疑增加了算法的處理負擔…

cuda 11.6 pytorch安裝

在安裝之前&#xff0c;需要先配置GPU環境&#xff08;安裝CUDA和CudaNN) 命令行輸入nvidia-smi&#xff0c;查看驅動信息 nvidia-smi 安裝相應的CUDA 和CUDANN 驗證&#xff1a;輸入nvcc --version 或者nvcc -V 進行檢查 nvcc --version nvcc -V 在anaconda里創建環境 co…

NLP課程筆記-基于transformers的自然語言處理入門

toc 項目地址 https://github.com/datawhalechina/learn-nlp-with-transformers/ 2017年&#xff0c;Attention Is All You Need論文&#xff08;Google Brain&#xff09;首次提出了Transformer模型結構并在機器翻譯任務上取得了The State of the Art(SOTA, 最好)的效果。2…

ADB安裝教程

1 adb簡介 Android 調試橋 (adb) 是一種功能多樣的命令行工具&#xff0c;可讓您與設備進行通信。 adb命令可用于執行各種設備操作&#xff0c;例如安裝和調試應用。 adb 提供對 Unix shell&#xff08;可用來在設備上運行各種命令&#xff09;的訪問權限。它是一種客戶端-服務…

一篇文章帶你弄懂Java集合的泛型

目錄 第一問&#xff1a;什么是泛型&#xff1f;有什么好處&#xff1f; 第二問&#xff1a;泛型是如何實現的呢&#xff1f; 第三問&#xff1a;類型擦除的缺點有哪些&#xff1f; 第四問&#xff1a;泛型中上下界限定符extends和super有什么區別&#xff1f; 第五問&…

HR人才測評,如何做中層管理人員的素質測評?

中層管理人員是企業中的重要力量&#xff0c;他們是連接高層管理和基層員工的橋梁&#xff0c;對企業的發展至關重要。因此&#xff0c;對中層管理人員的素質測評尤為重要。下面&#xff0c;我將介紹一些HR人才測評的方法和步驟&#xff0c;以幫助企業準確評估中層管理人員的素…

中信銀行積極開展2024年金融科技活動周宣傳活動

近日&#xff0c;2024年全國金融“科技活動周”正式啟動。中信銀行圍繞“弘揚科學家精神 激發全社會創新活力”為主題&#xff0c;積極面向公眾宣傳各類金融知識&#xff0c;全面營造熱愛科學、崇尚科學的社會氛圍。 自5月25日起&#xff0c;中信銀行通過全國網點大屏播放宣傳…

【C++】77組合

給定兩個整數 n 和 k&#xff0c;返回范圍 [1, n] 中所有可能的 k 個數的組合。 你可以按 任何順序 返回答案。 使用回溯算法。我們可以按照以下步驟來實現&#xff1a; 創建一個輔助函數 backtrack&#xff0c;用來進行回溯搜索。其中包括當前組合的狀態變量 current、起始…