歡迎來到培訓(xùn)無憂網(wǎng)!

全國切換

咨詢熱線 400-001-5729

位置:培訓(xùn)無憂網(wǎng) > 新聞資訊 > 電腦/IT > c語言 >  C語言培訓(xùn)返回內(nèi)部靜態(tài)成員的陷阱有哪些

C語言培訓(xùn)返回內(nèi)部靜態(tài)成員的陷阱有哪些

來源:m.universityresearchassociates.com 發(fā)布人:星星

2021-12-31 10:22:32|已瀏覽:2780次

C語言返回內(nèi)部靜態(tài)成員的陷阱

      我們用C/C++開發(fā)的過程中,總是有一個問題會給我們帶來苦惱。這個問題就是函數(shù)內(nèi)和函數(shù)外代碼需要通過一塊內(nèi)存來交互(比如,函數(shù)返回字符串),這個問題困擾和很多開發(fā)人員。如果你的內(nèi)存是在函數(shù)內(nèi)棧上分配的,那么這個內(nèi)存會隨著函數(shù)的返回而被彈棧釋放,所以,你一定要返回一塊函數(shù)外部還有效的內(nèi)存。

      這是一個讓無數(shù)人困擾的問題。如果你一不小心,你就很有可能在這個上面犯錯誤。當(dāng)然目前有很多解決方法,如果你熟悉一些標(biāo)準(zhǔn)庫的話,你可以看到許多各式各樣的解決方法。大體來說有下面幾種:
      1)在函數(shù)內(nèi)部通過malloc或new在堆上分配內(nèi)存,然后把這塊內(nèi)存返回(因?yàn)樵诙焉戏峙涞膬?nèi)存是全局可見的)。這樣帶來的問題就是潛在的內(nèi)存問題。因?yàn),如果返回出去的?nèi)存不釋放,那么就是memory Leak;蛘呤潜欢啻吾尫,從而造成程序的crash。這兩個問題都相當(dāng)?shù)膰?yán)重,所以這種設(shè)計(jì)方法并不推薦。(在一些Windows API中,當(dāng)你調(diào)用了一些API后,你必需也要調(diào)用他的某些API來釋放這塊內(nèi)存)
      2)讓用戶傳入一塊他自己的內(nèi)存地址,而在函數(shù)中把要返回的內(nèi)存放到這塊內(nèi)存中。這是一個目前普遍使用的方式。很多Windows API函數(shù)或是標(biāo)準(zhǔn)C函數(shù)都需要你傳入一個buffer和這個buffer的長度。這種方式對我們來說應(yīng)該是屢見不鮮了。這種方式的好處就是由函數(shù)外部的程序來維護(hù)這塊內(nèi)存,比較簡顯直觀。但問題就是在使用上稍許有些麻煩。不過這種方式把犯錯誤的機(jī)率減到了最低。

      3)第三種方式顯得比較另類,他利用了static的特性,static的棧內(nèi)存一旦分配,那這塊內(nèi)存不會隨著函數(shù)的返回而釋放,而且,它是全局可見的(只要你有這塊內(nèi)存的地址)。所以,有一些函數(shù)使用了static的這個特性,即不用使用堆上的內(nèi)存,也不需要用戶傳入一個buffer和其長度。從而,使用得自己的函數(shù)長得很漂亮,也很容易使用。

      本文由培訓(xùn)無憂網(wǎng)達(dá)內(nèi)教育專屬課程顧問老師整理發(fā)布,更多C語言課程信息可關(guān)注培訓(xùn)無憂網(wǎng)C語言培訓(xùn)頻道或添加老師微信:15033336050

      注:尊重原創(chuàng)文章,轉(zhuǎn)載請注明出處和鏈接 http://m.universityresearchassociates.com/news-id-11440.html 違者必究!部分文章來源于網(wǎng)絡(luò)由培訓(xùn)無憂網(wǎng)編輯部人員整理發(fā)布,內(nèi)容真實(shí)性請自行核實(shí)或聯(lián)系我們,了解更多相關(guān)資訊請關(guān)注c語言頻道查看更多,了解相關(guān)專業(yè)課程信息您可在線咨詢也可免費(fèi)申請?jiān)囌n。關(guān)注官方微信了解更多:150 3333 6050

留下你的信息,課程顧問老師會一對一幫助你規(guī)劃更適合你的專業(yè)課程!
  • 姓名:

  • 手機(jī):

  • 地區(qū):

  • 想學(xué)什么:

  • 培訓(xùn)無憂網(wǎng)
免 費(fèi) 申 請 試 聽
提交申請,《培訓(xùn)無憂網(wǎng)》課程顧問老師會一對一幫助你規(guī)劃更適合你的專業(yè)課程!