Re: [問題] 多型的自動回收

看板C_and_CPP (C/C++)作者 (沒事多聊天~ 歡迎打屁)時間16年前 (2009/10/07 16:15), 編輯推噓3(305)
留言8則, 2人參與, 最新討論串8/13 (看更多)
※ 引述《xam (聽說)》之銘言: : ※ 引述《legnaleurc (CA)》之銘言: : : ==== : : 我就是希望在 Base 這個層級就能在解構時自動回收 : : 但是礙於 destructor 內不能呼叫 virtual function : : 目前我只有檢查 flag : : 我只想問在這個狀況下有沒有比較好的做法 : 我覺得 littleshan 的文章(包含該篇及之前的推文)已經回答你的問題了 : 基本上就是使用 virtual destructor : jacobcrab 和 Ebergies 的提議似乎是把問題變複雜了 QQ 不,稍微有點不同,現在是原PO可能有個template method,所以希望所有subclass 去改寫doClose,但是難題是這個體系的class會被包在shared_ptr之類的東西 所以需要從destructor自動去釋放資源,所以無法用手動的方式處理 所以如果照 littleshan的方式並不能解決原PO的問題~ --- 話說如果用骯髒的方法解決可接受,加個flag表示已經被呼叫過... close() { if(already_closed){ return; } ..... doClose(); ..... already_closed=true; } 強迫所有override "doClose()與任何會因此被呼叫到的virtual function"的subclass 都在destructor內呼叫 close() 這樣應該可以解決問題,但是很髒就是了 XD -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 122.124.96.179

10/07 16:22, , 1F
ya~~終於有人理解我原本的點。可能我表達能力不好吧orz
10/07 16:22, 1F

10/07 16:22, , 2F
看到l大問問題就覺得這不單純....然後討論串都看不懂
10/07 16:22, 2F

10/07 16:23, , 3F
其實 client 還是可以手動呼叫 close 清理資源
10/07 16:23, 3F

10/07 16:23, , 4F
果然勾出一堆強者.....
10/07 16:23, 4F

10/07 16:23, , 5F
但是既然都用 shared_ptr 了,想知道能不能利用
10/07 16:23, 5F

10/07 16:24, , 6F
destructor 保證最後一定會回收
10/07 16:24, 6F

10/07 17:37, , 7F
我目前的做法也是在 Base::~Base 裡檢查這個 flag
10/07 17:37, 7F

10/07 17:38, , 8F
沒呼叫 close 就 assert 或記錄這條訊息
10/07 17:38, 8F
文章代碼(AID): #1Ap4ugDk (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1Ap4ugDk (C_and_CPP)