亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

如何讓C++函數(shù)返回值死心塌地為你工作

 更新時(shí)間:2018年01月20日 10:40:40   作者:kwsy2008  
這篇文章主要介紹了如何讓C++函數(shù)返回值死心塌地為你工作,小編覺(jué)得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下

本文主要研究的是C++函數(shù)返回值,你必須注意的問(wèn)題,下面進(jìn)入正題。

C++太繁雜了,先接觸C++后接觸python這樣的語(yǔ)言,你就再也不想碰它,因?yàn)?,就連一個(gè)函數(shù)返回值都一大堆的說(shuō)道,這里面的玄機(jī),連工作三年的C++熟手都未必能準(zhǔn)確的理解和運(yùn)用。

歸根結(jié)底,C++所面臨的問(wèn)題要求它提供各種各樣的機(jī)制以保證性能,也許,這輩子也見(jiàn)不到C++能安全有效的自己進(jìn)行內(nèi)存垃圾回收。。。。。

老程序猿都會(huì)提醒菜鳥(niǎo),注意函數(shù)的返回值,因?yàn)?,很可能,你的函?shù)返回的數(shù)據(jù)在后續(xù)的使用中會(huì)出錯(cuò)。那么函數(shù)在返回值時(shí)要注意什么呢?

本篇博客嘗試用最簡(jiǎn)練的普通大白話,講解函數(shù)返回值的問(wèn)題。

C++把內(nèi)存交給了程序猿,但是,請(qǐng)你注意,它可沒(méi)把所有的內(nèi)存都交給你,交給你的只是堆上的內(nèi)存,也就是你通過(guò)malloc函數(shù) 和new 關(guān)鍵字申請(qǐng)來(lái)的內(nèi)存,除了這些內(nèi)存以外,其他的內(nèi)存,你最好別碰,最好別碰,最好別碰,重要的事情說(shuō)三遍。

如果你的函數(shù)返回值在后續(xù)使用中出錯(cuò)了,尤其是返回函數(shù)內(nèi)的局部變量這種事情,那么,基本可以肯定,你碰了不該碰的內(nèi)存。這時(shí)候,你會(huì)覺(jué)得自己很冤枉啊,我沒(méi)有啊。但事實(shí)是,沒(méi)有冤枉你,所以,為了不被bug檢察院起訴你,作為一個(gè)C++程序猿,你必須學(xué)會(huì)甄別那些內(nèi)存是能碰的,那些內(nèi)存是不能碰的。

char *pstr = "This is the buffer text";  
return pstr; 

如果你的函數(shù)是這么寫(xiě)的,那么恭喜你,返回正確,因?yàn)檫@個(gè)pstr指向的是常量存儲(chǔ)區(qū),這里的內(nèi)存,你是可以碰的,但是注意,這個(gè)碰,僅僅是讀,你想修改,那是萬(wàn)萬(wàn)不可以的。

char buffer[] = "This is the buffer text";  
return buffer; 

如果你的函數(shù)是這么寫(xiě)的,那么恭喜你,等著bug聯(lián)邦檢察院起訴你吧。這里的buffer指向的是棧上內(nèi)存,這個(gè),就是你碰不得的,前面的pstr就好比公園,公園嘛,大家都可以來(lái)玩,但是你不能把公園里的假山拆了,你也不能把公園里的樹(shù)砍了,你只能是來(lái)玩,不能修改它,棧上的內(nèi)存,就好比是私家花園,你一個(gè)外人,是不能進(jìn)去的。那么怎么甄別的,方法倒也簡(jiǎn)單,你見(jiàn)到帶中括號(hào)的,就應(yīng)該明白,這東西是棧上的,出了這個(gè)函數(shù),你就別想再碰的,你只要敢碰,bug聯(lián)邦檢察院就會(huì)起訴你。

static char buffer[] = "This is the buffer text";  
return buffer; 

如果你的函數(shù)是這么寫(xiě)的,那么恭喜你,返回正確,可是剛才不是明明說(shuō),這里是私家花園嘛,沒(méi)錯(cuò),但是你注意看,前面還加了一個(gè)static,只要加了這個(gè)關(guān)鍵字,就相當(dāng)于說(shuō)國(guó)家把這個(gè)私家花園征用了,那么,它就從私家花園變成了靜態(tài)存儲(chǔ)區(qū)里的一個(gè)小花園,靜態(tài)存儲(chǔ)區(qū)里的內(nèi)存,國(guó)家說(shuō),靜態(tài)存儲(chǔ)區(qū)對(duì)外開(kāi)放,你們都可以來(lái)。

函數(shù)返回的都是值拷貝,棧上的內(nèi)存,在函數(shù)結(jié)束的時(shí)候,都會(huì)被收回。在函數(shù)內(nèi)部,你可以碰棧上的內(nèi)存,那是因?yàn)檫@個(gè)時(shí)候你是在棧的家里做客,那他們家的內(nèi)存小花園當(dāng)然允許你訪問(wèn),可是函數(shù)結(jié)束了,就相當(dāng)于你離開(kāi)了棧的家,棧把內(nèi)存小花園的門(mén)關(guān)上了,你怎么可以進(jìn)去,你進(jìn)去了,就會(huì)被bug聯(lián)邦法院起訴!

但是呢,總有一些奇怪的現(xiàn)象讓你以為你可以在函數(shù)結(jié)束后仍然可以訪問(wèn)棧上的內(nèi)存。

我們定義一個(gè)結(jié)構(gòu)體

struct person 
{ 
  int age; 
} 

寫(xiě)一個(gè)函數(shù)

person* getperson2() 
{ 
  person p; 
  p.age = 99; 
  return &p; 
} 

在得到函數(shù)的返回值以后,你可以輸出對(duì)象的年齡

person *p2 = getperson2(); 
cout<<p2->age<<endl; 

你會(huì)發(fā)現(xiàn),這段代碼居然可以正確執(zhí)行!在函數(shù)getperson2內(nèi)部,p這個(gè)變量是局部變量,必然是在棧上申請(qǐng)的,返回的是&p,這不就是棧上的內(nèi)存地址么,那為啥在函數(shù)外部,卻仍然可以輸出age呢?

雖然,函數(shù)結(jié)束后,對(duì)象被銷毀,但是銷毀的不夠徹底,似乎計(jì)算機(jī)在管理內(nèi)存時(shí)也不需要那么徹底的銷毀一個(gè)對(duì)象,你之所以能輸出age,那是因?yàn)槟莻€(gè)區(qū)域,沒(méi)有被徹底銷毀,這一小塊的內(nèi)存(存儲(chǔ)age的4個(gè)byte)沒(méi)有發(fā)生變化。你可以暫時(shí)的碰這塊內(nèi)存,但遲早是要出問(wèn)題的,如果某一刻,計(jì)算機(jī)打算用這塊內(nèi)存,發(fā)現(xiàn)你在非法使用,那么必然會(huì)報(bào)警,然后bug聯(lián)邦檢察院會(huì)起訴你。

為了讓問(wèn)題更透明一些,我們修改一下結(jié)構(gòu)體

struct person 
{ 
  int age; 
  char* name; 
  person() 
  { 
    name = new char(10); 
    strcpy(name,"sheng"); 
  } 
  ~person() 
  { 
    name = NULL; 
  } 
}; 
person* getperson2() 
{ 
  person p; 
  p.age = 99; 
  return &p; 
} 
person *p2 = getperson2(); 
cout<<p2->age<<endl; 
cout<<p2->name<<endl; 

這一次,函數(shù)結(jié)束后,對(duì)象的銷毀要比上一次徹底的多,雖然,age的區(qū)域還是沒(méi)有被徹底銷毀,但是name區(qū)域被徹底銷毀了,如果你訪問(wèn)name的區(qū)域,就必然出錯(cuò),這就好比啊,私家花園關(guān)門(mén)了,可是花園好大的,所以不是每一處都安裝了攝像頭和報(bào)警器,比如age這片區(qū)域,所以,你偷偷的從age這個(gè)區(qū)域溜進(jìn)去時(shí),花園的主人沒(méi)發(fā)現(xiàn),直到花園的巡防大隊(duì)到age區(qū)域巡防時(shí),發(fā)現(xiàn)你竟然在這里偷偷菜花,結(jié)果就是把你打的崩潰了。而name這邊區(qū)域,在~person這個(gè)析構(gòu)函數(shù)中安裝了攝像頭和報(bào)警器,你只要來(lái),就立刻報(bào)警,然后把你打的崩潰。

千言萬(wàn)語(yǔ),匯成一句話,函數(shù)不要返回指向棧的內(nèi)存地址,切記,是地址,別被嚇的所有的函數(shù)內(nèi)的變量都不敢返回,只要不是棧的內(nèi)存地址,你盡管放心的返回。

以上就是本文關(guān)于如何讓C++函數(shù)返回值死心塌地為你工作的全部?jī)?nèi)容,希望對(duì)大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站其他相關(guān)專題,如有不足之處,歡迎留言指出。感謝朋友們對(duì)本站的支持!

相關(guān)文章

  • C++中static修飾符的詳解及其作用介紹

    C++中static修飾符的詳解及其作用介紹

    這篇文章主要介紹了C++中static修飾符的詳解及其作用介紹,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-09-09
  • VS中的scanf_s函數(shù)和scanf用法及說(shuō)明

    VS中的scanf_s函數(shù)和scanf用法及說(shuō)明

    這篇文章主要介紹了VS中的scanf_s函數(shù)和scanf用法及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • Qt無(wú)邊框窗口拖拽和陰影的實(shí)現(xiàn)方法

    Qt無(wú)邊框窗口拖拽和陰影的實(shí)現(xiàn)方法

    這篇文章主要給大家介紹了關(guān)于Qt無(wú)邊框窗口拖拽和陰影的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • C語(yǔ)言移除元素的三種思路講解

    C語(yǔ)言移除元素的三種思路講解

    這篇文章主要介紹了C語(yǔ)言移除元素的三種思路,總的來(lái)說(shuō)這并不是一道難題,那為什么要拿出這道題介紹?拿出這道題真正想要傳達(dá)的是解題的思路,以及不斷優(yōu)化探尋最優(yōu)解的過(guò)程。希望通過(guò)這道題能給你帶來(lái)一種解題優(yōu)化的思路
    2022-10-10
  • C++堆排序算法實(shí)例詳解

    C++堆排序算法實(shí)例詳解

    這篇文章主要介紹了C++堆排序算法,簡(jiǎn)單分析了堆排序算法的原理并結(jié)合實(shí)例形式分析了C++實(shí)現(xiàn)堆排序的具體操作技巧,需要的朋友可以參考下
    2017-08-08
  • 通過(guò)一個(gè)小例子來(lái)簡(jiǎn)單理解C語(yǔ)言中的內(nèi)存空間管理

    通過(guò)一個(gè)小例子來(lái)簡(jiǎn)單理解C語(yǔ)言中的內(nèi)存空間管理

    這篇文章主要介紹了通過(guò)一個(gè)小例子來(lái)簡(jiǎn)單理解C語(yǔ)言中的內(nèi)存空間管理,涉及到堆和棧等數(shù)據(jù)結(jié)構(gòu)的基本知識(shí),需要的朋友可以參考下
    2015-11-11
  • C++實(shí)現(xiàn)主機(jī)字節(jié)序和網(wǎng)絡(luò)字節(jié)序轉(zhuǎn)換示例

    C++實(shí)現(xiàn)主機(jī)字節(jié)序和網(wǎng)絡(luò)字節(jié)序轉(zhuǎn)換示例

    這篇文章主要為大家介紹了C++實(shí)現(xiàn)主機(jī)字節(jié)序和網(wǎng)絡(luò)字節(jié)序轉(zhuǎn)換示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-11-11
  • C++虛函數(shù)注意事項(xiàng)

    C++虛函數(shù)注意事項(xiàng)

    這篇文章主要給大家分享了EC++虛函數(shù)注意事項(xiàng),
    2022-01-01
  • 詳解C++-二階構(gòu)造模式、友元

    詳解C++-二階構(gòu)造模式、友元

    這篇文章主要介紹了C++-二階構(gòu)造模式、友元,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • C語(yǔ)言時(shí)間函數(shù)之mktime和difftime詳解

    C語(yǔ)言時(shí)間函數(shù)之mktime和difftime詳解

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言時(shí)間函數(shù)之mktime和difftime,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一,希望能夠給你帶來(lái)幫助
    2022-02-02

最新評(píng)論