看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《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
legnaleurc:ya~~終於有人理解我原本的點。可能我表達能力不好吧orz 10/07 16:22
QQ29:看到l大問問題就覺得這不單純....然後討論串都看不懂 10/07 16:22
legnaleurc:其實 client 還是可以手動呼叫 close 清理資源 10/07 16:23
QQ29:果然勾出一堆強者..... 10/07 16:23
legnaleurc:但是既然都用 shared_ptr 了,想知道能不能利用 10/07 16:23
legnaleurc:destructor 保證最後一定會回收 10/07 16:24
legnaleurc:我目前的做法也是在 Base::~Base 裡檢查這個 flag 10/07 17:37
legnaleurc:沒呼叫 close 就 assert 或記錄這條訊息 10/07 17:38