讨论:关于boost中share_ptr的资源释放问题

ingor 2008-11-16 10:11:57
shared_ptr封装了
T * px; // contained pointer
detail::shared_count pn; // reference counter
而shared_count 封装了
sp_counted_base * pi_;

这里shared_count有两个主要的派生类
sp_counted_impl_p
sp_counted_impl_pd(提供了删除工具类)

删除对象的过程:
调用 pn的析构函数调用了sp_counted_base的release,进而调用了dispose();该函数为虚函数,因此会转而调用 sp_counted_impl_p或者sp_counted_impl_pd的dispose;那里要么调用delete,要么调用客户提供的删除函数。

这样的结构安排有什么值得深思的,我不太清楚为什么要进行这样的设计,是否有点太过于复杂了?
或者这里的各个实现细节是为了满足什么样的不同条件?
欢迎大家热烈讨论。
...全文
650 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
iambic 2008-11-30
  • 打赏
  • 举报
回复
兄弟,你不能光看析构函数吧?析构函数的逻辑往往是设计的自然结果,而不是刻意而为。
为什么“pn的析构函数调用了sp_counted_base的release”,那自然是因为pn用到了sp_counted_base啊……
waft_xu 2008-11-29
  • 打赏
  • 举报
回复
上边的例二有错误,修改如下

例二:
void main()
{
char *p = new char[100];//分配内存
shared_ptr frt_ptr;
{
shared_ptr sec_ptr(p);
frt_ptr = sec_ptr;
}
//此时p的内存未释放,frt_ptr对象析构时才会释放p的内存
waft_xu 2008-11-29
  • 打赏
  • 举报
回复
例一:
void main()
{
char *p = new char[100];//分配内存
{
shared_ptr frt_ptr(p);
}
//此时p的内存已释放
}
例二:
void main()
{
char *p = new char[100];//分配内存
shared_ptr frt_ptr;
{
shared_ptr sec_ptr(p);
frt_ptr.reset(p);//也可以使用frt_ptr = sec_ptr;
}
//此时p的内存未释放,frt_ptr对象析构时才会释放p的内存
}
waft_xu 2008-11-29
  • 打赏
  • 举报
回复
shared_ptr可以在多个shared_ptr对象之间共享指针的引用计数,当没有shared_ptr对象使用该指针时会自动释放。
Blue_Light 2008-11-28
  • 打赏
  • 举报
回复
高手啊,boost都研究了。
接分!
herman~~ 2008-11-16
  • 打赏
  • 举报
回复
没认真看过 boost库的实现
来学习的
fallening 2008-11-16
  • 打赏
  • 举报
回复
[Quote=引用楼主 ingor 的帖子:]
shared_ptr封装了
T * px;                    // contained pointer
detail::shared_countpn;    // reference counter
而shared_count 封装了
sp_counted_base *pi_;

这里shared_count有两个主要的派生类
sp_counted_impl_p
sp_counted_impl_pd(提供了删除工具类)

删除对象的过程:
调用pn的析构函数调用了sp_counted_base的release,进而调用了dispose();该函数为虚函数,因此会转而调用 sp_counted_impl_p或…
[/Quote]
boost之前直接使用了loki的方法,现在又换用了新的更复杂的办法;
如果楼主有意,不妨先看loki,看懂了那个再来看这个可能会更快上手
jieao111 2008-11-16
  • 打赏
  • 举报
回复
坐等大妈

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧