关于boost::shared_ptr...高兴得太早 - Charlie's Blog ...
来源:百度文库 编辑:神马文学网 时间:2024/04/27 17:33:04
关于boost::shared_ptr...高兴得太早 1 #include
2 #include
3 #include
4
5 using namespace std;
6
7 class A : public boost::enable_shared_from_this
8 {
9 public:
10 boost::shared_ptr child_;
11 boost::shared_ptr parent_;
12
13 void add(boost::shared_ptr child)
14 {
15 child_ = child;
16 child_->set(shared_from_this());
17 }
18
19 void set(boost::shared_ptr parent)
20 {
21 parent_ = parent;
22 }
23 };
24
25 int main()
26 {
27 boost::shared_ptr p1(new A);
28 boost::shared_ptr p2(new A);
29
30 p1->add(p2);
31
32 cout<33 cout<34 cout<child_<35 cout<parent_<36 cout<37 cout<38
39 return 0;
40 }
有了shared_from_this.. 我泪流满面
之前不知道这个的时候..用了很愚蠢的做法
void add(shared_ptr child)
child_ = child;
child_->set(shared_ptr(this));
}
结果错误连连~ 然后放弃使用shared_ptr... 用raw_ptr...
顺便推荐这本书
beyond_stl_cn.chm
放到了我的SVN上.. 一本很好的介绍Boost如何使用的书..
http://code.google.com/p/charlib/source/browse/trunk/Boost%20Book/Beyond_STL_cn.rar
进入页面后点右下的 view raw file 就可以下载了
以上是早上写的.. 写好后很高兴的发布了.. 但是后来发现上面这段程序非常的白痴
最关键的就在于,其实这上面的两个shared_ptr已经循环引用了.. 再也没有办法自动解开
资源也就套死在了原地.. Oh My God... 居然愚蠢到这种地步..
然后才发现.. weak_ptr 一点都不weak.. 这里就需要用weak_ptr来处理!
换成下面这个...
#include
#include
#include
#include
using namespace std;
class A : public boost::enable_shared_from_this
{
public:
A(const int id) : id_(id) { cout< ~A() { cout<
int id_;
boost::shared_ptr child_;
boost::weak_ptr parent_;
void add(boost::shared_ptr child)
{
child_ = child;
child_->set(shared_from_this());
}
void set(boost::shared_ptr parent)
{
parent_ = parent;
}
boost::shared_ptr get_parent()
{
return parent_.lock();
}
};
int main()
{
boost::shared_ptr p1(new A(1));
boost::shared_ptr p2(new A(2));
p1->add(p2);
return 0;
}
通过这个测试..
输出的结果是
1 Construct
2 Construct
1 Destruct
2 Destruct
这样的输出并不奇怪. 因为 weak_ptr 是 shared_ptr 的观察者,将 shared_ptr 传给 weak_ptr 不会增加 shared_ptr的引用计数. 所以这里的操作, p2 的引用计数是2, p1 的引用计数是1, 所以p1是unique的,p1先析构,p2的引用计数-1,然后析构.
不过这里资源的析构顺序可能不是我们关心的范围,我这里认为把资源丢给智能指针这类物件管理后,主要是为了资源不泄漏,资源的析构顺序如果在关心的范围,也就该自己管理该资源了.
自己犯的一个低级错误,赶忙把帖子存草稿了. 现在弄清楚怎么处理后,才敢发上来,呵呵~ ^ ^
2 #include
3 #include
4
5 using namespace std;
6
7 class A : public boost::enable_shared_from_this
8 {
9 public:
10 boost::shared_ptr child_;
11 boost::shared_ptr parent_;
12
13 void add(boost::shared_ptr child)
14 {
15 child_ = child;
16 child_->set(shared_from_this());
17 }
18
19 void set(boost::shared_ptr parent)
20 {
21 parent_ = parent;
22 }
23 };
24
25 int main()
26 {
27 boost::shared_ptr p1(new A);
28 boost::shared_ptr p2(new A);
29
30 p1->add(p2);
31
32 cout<
39 return 0;
40 }
有了shared_from_this.. 我泪流满面
之前不知道这个的时候..用了很愚蠢的做法
void add(shared_ptr child)
child_ = child;
child_->set(shared_ptr(this));
}
结果错误连连~ 然后放弃使用shared_ptr... 用raw_ptr...
顺便推荐这本书
beyond_stl_cn.chm
放到了我的SVN上.. 一本很好的介绍Boost如何使用的书..
http://code.google.com/p/charlib/source/browse/trunk/Boost%20Book/Beyond_STL_cn.rar
进入页面后点右下的 view raw file 就可以下载了
以上是早上写的.. 写好后很高兴的发布了.. 但是后来发现上面这段程序非常的白痴
最关键的就在于,其实这上面的两个shared_ptr已经循环引用了.. 再也没有办法自动解开
资源也就套死在了原地.. Oh My God... 居然愚蠢到这种地步..
然后才发现.. weak_ptr 一点都不weak.. 这里就需要用weak_ptr来处理!
换成下面这个...
#include
#include
#include
#include
using namespace std;
class A : public boost::enable_shared_from_this
{
public:
A(const int id) : id_(id) { cout<
int id_;
boost::shared_ptr child_;
boost::weak_ptr parent_;
void add(boost::shared_ptr child)
{
child_ = child;
child_->set(shared_from_this());
}
void set(boost::shared_ptr parent)
{
parent_ = parent;
}
boost::shared_ptr get_parent()
{
return parent_.lock();
}
};
int main()
{
boost::shared_ptr p1(new A(1));
boost::shared_ptr p2(new A(2));
p1->add(p2);
return 0;
}
通过这个测试..
输出的结果是
1 Construct
2 Construct
1 Destruct
2 Destruct
这样的输出并不奇怪. 因为 weak_ptr 是 shared_ptr 的观察者,将 shared_ptr 传给 weak_ptr 不会增加 shared_ptr的引用计数. 所以这里的操作, p2 的引用计数是2, p1 的引用计数是1, 所以p1是unique的,p1先析构,p2的引用计数-1,然后析构.
不过这里资源的析构顺序可能不是我们关心的范围,我这里认为把资源丢给智能指针这类物件管理后,主要是为了资源不泄漏,资源的析构顺序如果在关心的范围,也就该自己管理该资源了.
自己犯的一个低级错误,赶忙把帖子存草稿了. 现在弄清楚怎么处理后,才敢发上来,呵呵~ ^ ^
关于boost::shared_ptr...高兴得太早 - Charlie's Blog ...
高市选举翻盘?蓝营高兴太早
不要高兴的太早:钓鱼岛争端才刚刚开始!
不要高兴的太早:中日钓鱼岛争端才刚刚开始
孩子上学太早容易得多动症
Blog Basics: How a Blog Can Boost Your Career...
Alexis Zhang‘s Blog : 关于 Windows 默认共享的关闭
关于标点符号的英语解释[zz] | Jeffrey's Blog
我们不要高兴太早,其实内忧外患比我们想象的多 - 国际展望 - 军事论坛
韩乔生:男篮莫高兴太早 篮板困扰或重演釜山失利
玩得高兴也要玩得文明[组图]
中国的新人口警钟敲响得太早了
爱情晚点来,就不会走得太早。
耐得住寂寞为何更易成功? - 心理咨询师王波's BLOG - 世界经理人网站
- ax‘s blog
- linghucong‘s blog...
Alex‘s Blog
Ming‘s Web Blog
Xie Yubo‘s Blog
海戈‘s blog
Alex‘s Blog
Pod‘‘s Blog!
iThink‘s blog
xroot‘s Blog