Re: 若在 function 動態配置又要傳回去 那該在哪還?

看板C_and_CPP作者 (cppOrz)時間18年前 (2006/03/28 06:10), 編輯推噓3(301)
留言4則, 3人參與, 最新討論串1/3 (看更多)
※ 引述《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
我是原po 那以我貼的例子 應該要怎麼寫會比較好? c++感謝
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
我把原來錯誤的部份更正了,sorry ~~
04/01 12:19, 4F
文章代碼(AID): #14A6Bbsg (C_and_CPP)
文章代碼(AID): #14A6Bbsg (C_and_CPP)