Re: 若在 function 動態配置又要傳回去 那該在哪還?
※ 引述《asleepme ( 機車蔡老頭)》之銘言:
: 關於個問題我也很有興趣耶
: 不知道有哪位熟悉的人能幫忙解釋呢?
: 像這樣的狀況
: 在離開 fun()時b應該從heap中清掉了
: 所以可以這樣用嗎?
: 還是得用 fun( struc bank &b ) ?
: 這邊衍生出一個問題就是
: 是不是涉及指標就不能用return的方式?
可以的。因為 return 的是 new 出來的位址,離開
函式時,被清掉的指標只是區域變數。
: 也就是說在subroutine裡面假如malloc or new 了記憶體區段
: 然後想把這段傳回去
: 那就得在進來fun時也同時傳pointer過來
: 在程式離開之後再用這個pointer去free or delete
其實原本把物件透過參數列傳進來,是比較正確的作法,但在 C
語言裏面沒有 reference,語法較為複雜,所以就直接 return
new 或 malloc 出來的位址:
T *foo(); // implement by malloc; call free whenever used
: 而不能在fun裡面救free or delete ?
: 是這樣嗎?
其實沒有很硬性的規定,也就是說,只要程式能正確執行,怎麼
做都可以,好與壞只是看你從什麼觀點去評估。
return 一個動態配置的內存位置,在 C 是很常見的作法,例如
str_dup 之類的,缺點是用戶要記得去 free 它,不然會有內存
泄漏的狀況。
從現代編程的觀點來看,這種作法不太符合物件導向的精神,因
為它讓「配置」和「釋放」這一組操作分散到兩個模組去,而這
兩個模組原本可能是無關的。
(也就是說,如果在兩個相關程度很高的模組之間,例如同一個
class 或同一 pattern 之內兩個函式,這種設計就合理。反之,
設計出像 str_dup 這樣的 Library 就不是挺好)
C++ 通常還有兩種比較安全(?)的方法:
std::auto_ptr<T> foo();
boost::shared_ptr<T> foo();
雖然說是比較「安全」,但如果沒有清楚了解它的用法,是很容
易不小心誤用的(尤其是 auto_ptr)。
到了比較新的語言,例如 Java,因為它的語言核心就沒有 free/
delete 的概念,其實根本連指標的語法都沒有,所以語法上只要
直接回傳物件就行了,語言底層會以 reference 的方式實現。
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 59.120.214.120
推
03/28 09:10, , 1F
03/28 09:10, 1F
推
04/01 10:16, , 2F
04/01 10:16, 2F
推
04/01 10:16, , 3F
04/01 10:16, 3F
※ 編輯: cppOrz 來自: 59.120.214.120 (04/01 12:19)
→
04/01 12:19, , 4F
04/01 12:19, 4F
討論串 (同標題文章)
完整討論串 (本文為第 1 之 3 篇):
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章