函數(shù)可以返回地址值對(duì)不對(duì)?
答案是肯定的。函數(shù)返回地址值,在C++或者C語言應(yīng)用非常普遍。典型的應(yīng)用事例是定義返回指針類型的函數(shù),使用時(shí)也有些需要注意的事項(xiàng)。
首先,確保返回的地址對(duì)應(yīng)的內(nèi)存塊的有效性。換句話說,程序員要確保至某個(gè)地址在所有應(yīng)用它的程序塊執(zhí)行之前必須有效。實(shí)際使用時(shí)大家經(jīng)常犯的錯(cuò)誤是返回局部變量的地址,如下面的偽代碼所示:
int* func()
{
int iret;
return &iret;
}
func函數(shù)執(zhí)行返回之后,iret對(duì)應(yīng)的內(nèi)存地址由于在棧上,很快就會(huì)被系統(tǒng)回收,地址也就隨之失效。再次訪問時(shí),常常爆出非法訪問的錯(cuò)誤。正確的方式應(yīng)是返回堆上內(nèi)存地址,寫法如下:
int* func()
{
int* pRet;
pRet = new int;
return pRet;
}。
其次,函數(shù)返回地址的情況不應(yīng)濫用。實(shí)際上在編碼過程中,原則是盡量避免指針類型的返回值。常用指針類型或者引用類型入?yún)⑻娲康氖翘岣叽a的可讀性,避免內(nèi)存泄露。避免內(nèi)存泄露最好的原則是哪個(gè)函數(shù)里申請(qǐng),就在哪個(gè)函數(shù)里釋放。
最后,會(huì)用返回指針的函數(shù)。返回指針的函數(shù)應(yīng)用最多的當(dāng)屬設(shè)計(jì)模式中的工廠模式。這屬于面向?qū)ο蟮姆懂牐瑢?duì)象工廠負(fù)責(zé)構(gòu)建和銷毀對(duì)象,與函數(shù)的內(nèi)存申請(qǐng)釋放異曲同工。
總之,地址即內(nèi)存管理,弄清這個(gè)關(guān)系,一切迎刃而解。