作者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
1F:推 legnaleurc:ya~~终於有人理解我原本的点。可能我表达能力不好吧orz 10/07 16:22
2F:推 QQ29:看到l大问问题就觉得这不单纯....然後讨论串都看不懂 10/07 16:22
3F:→ legnaleurc:其实 client 还是可以手动呼叫 close 清理资源 10/07 16:23
4F:→ QQ29:果然勾出一堆强者..... 10/07 16:23
5F:→ legnaleurc:但是既然都用 shared_ptr 了,想知道能不能利用 10/07 16:23
6F:→ legnaleurc:destructor 保证最後一定会回收 10/07 16:24
7F:推 legnaleurc:我目前的做法也是在 Base::~Base 里检查这个 flag 10/07 17:37
8F:→ legnaleurc:没呼叫 close 就 assert 或记录这条讯息 10/07 17:38