答案是肯定的。函式返回地址值,在C++或者C語言應用非常普遍。典型的應用事例是定義返回指標型別的函式,使用時也有些需要注意的事項。
首先,確保返回的地址對應的記憶體塊的有效性。換句話說,程式設計師要確保至某個地址在所有應用它的程式塊執行之前必須有效。實際使用時大家經常犯的錯誤是返回區域性變數的地址,如下面的虛擬碼所示:
int* func()
{
int iret;
return &iret;
}
func函式執行返回之後,iret對應的記憶體地址由於在棧上,很快就會被系統回收,地址也就隨之失效。再次訪問時,常常爆出非法訪問的錯誤。正確的方式應是返回堆上記憶體地址,寫法如下:
int* pRet;
pRet = new int;
return pRet;
}。
其次,函式返回地址的情況不應濫用。實際上在編碼過程中,原則是儘量避免指標型別的返回值。常用指標型別或者引用型別入參替代,目的是提高程式碼的可讀性,避免記憶體洩露。避免記憶體洩露最好的原則是哪個函數里申請,就在哪個函數里釋放。
最後,會用返回指標的函式。返回指標的函式應用最多的當屬設計模式中的工廠模式。這屬於面向物件的範疇,物件工廠負責構建和銷燬物件,與函式的記憶體申請釋放異曲同工。
總之,地址即記憶體管理,弄清這個關係,一切迎刃而解。
答案是肯定的。函式返回地址值,在C++或者C語言應用非常普遍。典型的應用事例是定義返回指標型別的函式,使用時也有些需要注意的事項。
首先,確保返回的地址對應的記憶體塊的有效性。換句話說,程式設計師要確保至某個地址在所有應用它的程式塊執行之前必須有效。實際使用時大家經常犯的錯誤是返回區域性變數的地址,如下面的虛擬碼所示:
int* func()
{
int iret;
return &iret;
}
func函式執行返回之後,iret對應的記憶體地址由於在棧上,很快就會被系統回收,地址也就隨之失效。再次訪問時,常常爆出非法訪問的錯誤。正確的方式應是返回堆上記憶體地址,寫法如下:
int* func()
{
int* pRet;
pRet = new int;
return pRet;
}。
其次,函式返回地址的情況不應濫用。實際上在編碼過程中,原則是儘量避免指標型別的返回值。常用指標型別或者引用型別入參替代,目的是提高程式碼的可讀性,避免記憶體洩露。避免記憶體洩露最好的原則是哪個函數里申請,就在哪個函數里釋放。
最後,會用返回指標的函式。返回指標的函式應用最多的當屬設計模式中的工廠模式。這屬於面向物件的範疇,物件工廠負責構建和銷燬物件,與函式的記憶體申請釋放異曲同工。
總之,地址即記憶體管理,弄清這個關係,一切迎刃而解。