作者cplusplus (沒事多聊天~ 歡迎打屁)
看板C_and_CPP
標題Re: [問題] 多型的自動回收
時間Wed Oct 7 16:15:37 2009
※ 引述《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