成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

為什么重復free()比內(nèi)存泄漏危害更大

開發(fā) 后端
free()與malloc()函數(shù)配對使用,釋放malloc函數(shù)申請的動態(tài)內(nèi)存。本文介紹了重復使用free()筆內(nèi)存泄漏危害更大的原因,一起來看。

C程序設計中,內(nèi)存操作相關(guān)的錯誤可以說是最常見,同時也是非常隱蔽的一類錯誤。這類錯誤往往導致程序莫名其妙地崩潰、耗盡系統(tǒng)資源,或是形成嚴重的安全弱點。

在 FreeBSD,以及多數(shù)其他 BSD 派生的系統(tǒng)中,重復 free() 在默認情況下都會導致 C 函數(shù)庫調(diào)用 abort() 終止程序。除了 malloc(3) 函數(shù)族本身的設計之外,這也是一項非常重要的安全特性。與此相反,包括 *BSD 在內(nèi)的多數(shù)系統(tǒng)的 C 函數(shù)庫并不對堆進行審計,也就是說,從 API 設計者的觀點來看,內(nèi)存泄漏并不被認為是非常嚴重的程序設計問題。

為什么會有這樣的區(qū)別呢?事實上,內(nèi)存泄漏同樣可以導致比較嚴重的問題,例如響應速度變慢、進程由于占用的資源太多而被 OS 殺掉導致 DoS 等等。為了回答這個問題,我們來觀察一下兩種問題出現(xiàn)的場景。

內(nèi)存泄漏 是指這樣一種場景:程序分配了一塊內(nèi)存,但已經(jīng)不再持有引用這塊內(nèi)存的對象(通常是指針)。從 OS 的角度,它知道進程持有的內(nèi)存數(shù)量;然而,從進程的角度,它可能并不完全知道自己持有哪些內(nèi)存。

換言之,內(nèi)存泄漏就是通過遍歷進程內(nèi)所有可以從棧上,或以靜態(tài)變量形式存于堆上的指針及其后繼,無法到達所有全部已分配內(nèi)存的情形。

如果程序不存在其他問題(例如緩沖區(qū)溢出),此時程序訪問內(nèi)存時,任何時候都不會在無意中覆寫超出范圍的數(shù)據(jù)。即,將數(shù)據(jù)覆寫到程序其他部分保存數(shù)據(jù)的內(nèi)存單元。

而 重復釋放 則指這樣一種場景:程序分配一塊內(nèi)存之后,經(jīng)過使用將這塊內(nèi)存釋放,但并沒有將指向這塊內(nèi)存的所有指針抹零或回收,并在其他部分再次將指向同一塊內(nèi)存單元的指針交給內(nèi)存分配器去進行釋放操作。這種情況下,我們可以斷言:

1、程序邏輯并不清楚這塊內(nèi)存已經(jīng)被釋放;

2、有理由相信,對這塊內(nèi)存進行的寫操作,可能已經(jīng)影響了程序其他部分的行為,因為這塊內(nèi)存可能已經(jīng)分配作為其他用途。
因此,這應被看作立即停止程序運行的一項致命錯誤,因為程序行為已經(jīng)出現(xiàn)了異常,而C函數(shù)庫擁有的信息不足以糾正這種異常行為,而另一方面,程序可能已經(jīng)發(fā)生了堆緩沖區(qū)溢出。

為了削弱這類問題帶來的實質(zhì)性安全影響,現(xiàn)代的內(nèi)存分配器往往會將尺寸接近的內(nèi)存塊放在一起(這樣做還能夠抑制內(nèi)存碎片的產(chǎn)生,并提高CPU的數(shù)據(jù)緩存命中率,因為通常程序會傾向于一次性地訪問相近的內(nèi)存結(jié)構(gòu))。

從而能夠在一定程度上減輕由于向已經(jīng)釋放的內(nèi)存塊繼續(xù)寫數(shù)據(jù)導致的損害(因為這些內(nèi)存很可能被分配給同樣的數(shù)據(jù)結(jié)構(gòu),這類寫操作的危害往往會低于向其他類型的數(shù)據(jù)結(jié)構(gòu)寫數(shù)據(jù),特別是當這些數(shù)據(jù)中包含一部分用戶輸入的時候)。

當然,徹底消除這類問題,需要為程序設計語言增加一些新的基礎設施(例如強類型、托管內(nèi)存等)。現(xiàn)代程序設計語言如Java、Python和.net系列等,都采用了避免這類問題的措施。然而,也正因為如此,通過這些語言入門并準備撰寫 C 程序的開發(fā)人員就更需要注意這類問題。

【編輯推薦】

  1. C++三則 如無必要 勿增虛函數(shù)
  2. 關(guān)于C++虛函數(shù)那點破事
  3. 淺談怎樣加快C++代碼的編譯速度
  4. 善于從bug中分析問題也是一種能力
  5. 頁面制作也是一門藝術(shù)
責任編輯:于鐵 來源: delphij's Chaos
相關(guān)推薦

2021-08-10 09:58:59

ThreadLocal內(nèi)存泄漏

2025-04-01 05:22:00

JavaThread變量

2024-09-29 08:57:25

2018-07-30 12:04:33

2022-08-08 07:33:11

虛擬存儲計算機系統(tǒng)物理內(nèi)存

2010-09-30 14:01:38

2025-06-05 03:10:00

mmapmalloc共享內(nèi)存

2021-01-13 10:51:08

PromissetTimeout(函數(shù)

2022-11-10 15:32:29

2009-04-23 00:35:44

2015-07-31 16:29:15

DockerJavaLinux

2019-04-24 08:00:00

HTTPSHTTP前端

2021-12-27 07:10:26

ClassmethodStaticmetho函數(shù)

2016-12-14 12:02:01

StormHadoop大數(shù)據(jù)

2017-02-14 14:20:02

StormHadoop

2024-03-11 08:22:40

Java內(nèi)存泄漏

2023-12-18 10:45:23

內(nèi)存泄漏計算機服務器

2012-02-22 21:28:58

內(nèi)存泄漏

2024-08-19 00:10:05

RocketMQ應用SDK

2020-03-18 14:08:48

Windows操作系統(tǒng)功能
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 亚洲视频手机在线 | 99爱免费| 亚洲激情在线观看 | 国产一区 在线视频 | 伊人网站在线观看 | 成人在线影视 | 国产精品九九九 | 精品伊人| 日本精品一区二区三区在线观看 | 日本亚洲一区二区 | 亚洲欧美日韩精品久久亚洲区 | 国产成人在线一区 | 97人人超碰 | av天天爽| 精品国产精品国产偷麻豆 | 中文字幕乱码一区二区三区 | 美国一级片在线观看 | 8x国产精品视频一区二区 | 亚洲第一网站 | 欧美性生活网 | 欧美成人h版在线观看 | 97人人爱 | 日韩午夜网站 | 二区视频 | 日韩欧美在线免费观看视频 | 在线观看午夜视频 | 欧美电影在线观看网站 | 国产精品五月天 | www..99re| 中文字幕免费视频 | 黄频视频| 91短视频网址 | 久久国产精品免费一区二区三区 | 91人人看 | 久久爱综合 | 在线三级网址 | 久久99深爱久久99精品 | 精品亚洲一区二区 | 人人爽人人草 | 久久久91 | 一区二区三区视频在线观看 |