关于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,然后析构.

不过这里资源的析构顺序可能不是我们关心的范围,我这里认为把资源丢给智能指针这类物件管理后,主要是为了资源不泄漏,资源的析构顺序如果在关心的范围,也就该自己管理该资源了.

自己犯的一个低级错误,赶忙把帖子存草稿了. 现在弄清楚怎么处理后,才敢发上来,呵呵~ ^ ^