淺談c/c++中使用指針需要注意的問題
一、使用指針的時候需要注意幾點(diǎn):
• 分配空間
• 初始化
• 釋放
二、常見的錯誤有幾種:
1)內(nèi)存分配未成功,卻使用了它
編程新手常犯這種錯誤,因?yàn)樗麄儧]有意識到內(nèi)存分配會不成功。常用解決辦法是,使用內(nèi)存之前檢查指針是否為Null。
如果指針p是函數(shù)的參數(shù),那么在函數(shù)的入口處用assert(p != NULL)進(jìn)行檢查。如果使用malloc或new來申請內(nèi)存,應(yīng)該用if(p == NULL)或if(p != NULL)進(jìn)行放錯處理。
2)內(nèi)存分配雖然成功,但是尚未初始化就引用它
犯這種錯誤主要有個起因:一是沒有初始化的觀念;二是誤以為內(nèi)存的缺省初值全為零,導(dǎo)致引用初值錯誤(eg. char p[]={‘\0'}).內(nèi)存的缺省初值究竟是什么并沒有統(tǒng)一的標(biāo)準(zhǔn),盡管有些時候?yàn)榱?,所以無論用何種方式創(chuàng)建數(shù)組,都別忘了賦初值,即便是賦零值也不可省略,不要嫌麻煩。
3)內(nèi)存分配成功并且已經(jīng)初始化,但操作越過了內(nèi)存的邊界
例如在使用數(shù)組是經(jīng)常發(fā)生下標(biāo)”多1”或者“少1”的操作,特別是在for循環(huán)語句中,循環(huán)次數(shù)很容易搞錯,導(dǎo)致數(shù)組操作越界。
4)忘記了釋放內(nèi)存,造成內(nèi)存泄露
含有這種錯誤的函數(shù)每被調(diào)用一次就丟失一塊內(nèi)存,剛開始時系統(tǒng)的內(nèi)存充足。你看不到錯誤。當(dāng)程序所占內(nèi)存大時,系統(tǒng)出現(xiàn)提示:內(nèi)存耗盡。動態(tài)內(nèi)存的申請與釋放必須配對,程序中malloc與free的使用次數(shù)一定要相同,否則肯定有錯誤
5)釋放了內(nèi)存卻繼續(xù)使用它
出現(xiàn)這種情況,有三個原因:<1>程序中的對象調(diào)用關(guān)系過于復(fù)雜,實(shí)在難以搞清楚某個對象究竟是否已經(jīng)釋放了內(nèi)存,此時應(yīng)該重新設(shè)計(jì)數(shù)據(jù)結(jié)構(gòu),從根本上解決對象管理的混亂局面。<2>函數(shù)的return語句寫錯了,注意不要返回指向“棧內(nèi)存”的“指針”或者“引用”,因?yàn)樵搩?nèi)存在函數(shù)體結(jié)束時被自動銷毀。<3>使用free或delete釋放了內(nèi)存后,沒有將指針設(shè)置為NULL。導(dǎo)致產(chǎn)生“野指針”
[規(guī)則1] 用malloc或new申請內(nèi)存之后,因該立即檢查指針值是否為NULL。防止使用指針值為NULL的內(nèi)存。
[規(guī)則2] 不要忘記為數(shù)組和動態(tài)內(nèi)存賦初值。防止將未被初始化的內(nèi)存作為右值使用。
[規(guī)則3] 避免數(shù)字或指針的下標(biāo)越界,特別要當(dāng)心發(fā)生“多1”或者“少1”操作
[規(guī)則4] 動態(tài)內(nèi)存的申請與釋放必須配對,防止內(nèi)存泄漏
[規(guī)則5] 用free或delete釋放了內(nèi)存之后,立即將指針設(shè)置為NULL,防止“野指針”
以上這篇淺談c/c++中使用指針需要注意的問題就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持我們。
欄 目:C語言
下一篇:C++位運(yùn)算符詳解(異或運(yùn)算符和移位運(yùn)算符)
本文標(biāo)題:淺談c/c++中使用指針需要注意的問題
本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/2260.html
您可能感興趣的文章
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言中對數(shù)函數(shù)的表達(dá)式 c語言中對數(shù)怎么表達(dá)
- 04-02c語言沒有round函數(shù) round c語言
- 04-02C語言中怎么打出三角函數(shù) c語言中怎么打出三角函數(shù)的值
- 01-10深入理解C++中常見的關(guān)鍵字含義
- 01-10使用C++實(shí)現(xiàn)全排列算法的方法詳解
- 01-10深入Main函數(shù)中的參數(shù)argc,argv的使用詳解
- 01-10APUE筆記之:進(jìn)程環(huán)境詳解
- 01-10c++中inline的用法分析
- 01-10如何尋找數(shù)組中的第二大數(shù)


閱讀排行
本欄相關(guān)
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言的正則匹配函數(shù) c語言正則表達(dá)
- 04-02c語言用函數(shù)寫分段 用c語言表示分段
- 04-02c語言中對數(shù)函數(shù)的表達(dá)式 c語言中對
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數(shù) c語言中怎
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求
隨機(jī)閱讀
- 01-10C#中split用法實(shí)例總結(jié)
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 01-11ajax實(shí)現(xiàn)頁面的局部加載
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 04-02jquery與jsp,用jquery
- 01-10delphi制作wav文件的方法
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改