中文字幕理论片,69视频免费在线观看,亚洲成人app,国产1级毛片,刘涛最大尺度戏视频,欧美亚洲美女视频,2021韩国美女仙女屋vip视频

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
安全起見,小心使用C語言realloc()函數(shù)
在C語言中,良好的編程習(xí)慣要求一個函數(shù)只做一件事,如果一個函數(shù)實現(xiàn)了若干功能,可以說基本是一個糟糕的設(shè)計。

C語言 realloc() 函數(shù)位于 stdlib.h 頭文件中,其原型為:
    void *realloc(void *ptr, size_t size);

realloc() 會將 ptr 所指向的內(nèi)存塊的大小修改為 size,并將新的內(nèi)存指針返回。

設(shè)之前內(nèi)存塊的大小為 n,如果 size < n,那么截取的內(nèi)容不會發(fā)生變化,如果 size > n,那么新分配的內(nèi)存不會被初始化。

如果 ptr = NULL,那么相當(dāng)于調(diào)用 malloc(size);如果 size = 0,那么相當(dāng)于調(diào)用 free(ptr)。

如果 ptr 不為 NULL,那么他肯定是由之前的內(nèi)存分配函數(shù)返回的,例如 malloc()、calloc()或realloc()。

如果 ptr 所指的內(nèi)存塊被移動,那么會調(diào)用 free(ptr)。

看吧,一個簡單的 realloc() 卻賦予了好幾個功能,這并不是良好的函數(shù)設(shè)計。估計也是為了兼容性,才容忍這個函數(shù)一直在C庫中。雖然在編碼中,realloc() 會提供一定的方便,但是也很容易引發(fā)Bug。

下面就舉兩個例子,來說明一下。

1) realloc() 第一種行為引發(fā)的Bug
  1. void *ptr = realloc(ptr, new_size);
  2. if (!ptr) {
  3. // 錯誤處理
  4. }
這里就引出了一個內(nèi)存泄露的問題,當(dāng)realloc() 分配失敗的時候,會返回NULL。但是參數(shù)中的 ptr 的內(nèi)存是沒有被釋放的。如果直接將realloc()的返回值賦給ptr。那么當(dāng)申請內(nèi)存失敗時,就會造成ptr原來指向的內(nèi)存丟失,造成內(nèi)存游離和泄露。

正確的處理應(yīng)該是這樣:
  1. void *new_ptr = realloc(ptr, new_size);
  2. if (!new_ptr) {
  3. // 錯誤處理。
  4. }
  5. ptr = new_ptr

2) 第三種行為引發(fā)的Bug
實際上,malloc(0)是合法的語句,會返還一個合法的指針,且該指針可以通過free去釋放。這就造成了很多人對realloc()的錯誤理解,認(rèn)為當(dāng)size為0時,實際上realloc()也會返回一個合法的指針,后面依然需要使用free去釋放該內(nèi)存。
  1. void *new_ptr = realloc(old_ptr, new_size);
  2. //其它代碼
  3. free(new_ptr);
由于錯誤的認(rèn)識,不去檢驗new_size是否為0,還是按照new_size不為0的邏輯處理,最后并free(new_ptr)。這里就引入了double free的問題,造成程序崩潰。

所以,realloc() 這個設(shè)計并不怎么優(yōu)良的函數(shù)陷阱還是不少的,一不小心就踩雷了,上面只是兩個簡單的小例子,大家在實際使用的時候還應(yīng)該注意一些其他小問題。
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
動態(tài)內(nèi)存分配函數(shù)解析
c與c++分別是怎樣動態(tài)分配和釋放內(nèi)存的,有什么區(qū)別?(轉(zhuǎn)) demo大全
malloc
malloc()與calloc區(qū)別
內(nèi)存分配不再神秘:深入剖析malloc函數(shù)實現(xiàn)原理與機(jī)制
realloc,malloc,calloc的區(qū)別及free 
更多類似文章 >>
生活服務(wù)
熱點新聞
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服