GameAcademe

  C++博客 :: 首页 :: 联系 :: 聚合  :: 管理
  0 Posts :: 14 Stories :: 5 Comments :: 0 Trackbacks

常用链接

留言簿(5)

我参与的团队

搜索

  •  

最新评论

要想让两个boost::shared_ptr指针指向同一个实例对象,那么在赋值时要注意,应该使用以下的形式:

 1void main()
 2{
 3 int* p = new int;
 4 boost::shared_ptr<int> pA(p);
 5 boost::shared_ptr<int> pB = pA;
 6
 7 cout<<"object count = "<<pA.use_count()<<endl;
 8 cout<<"object count = "<<pB.use_count()<<endl;
 9}

10
11

 这时候,输出的object count值为2,表示有两个智能指针指向同一个实例对象,而不能如下:

1void main()
2{
3 int* p = new int;
4 boost::shared_ptr<int> pA(p);
5 boost::shared_ptr<int> pB(p);
6
7 cout<<"object count = "<<pA.use_count()<<endl;
8 cout<<"object count = "<<pB.use_count()<<endl;
9}

表面看起来,在初始化阶段,两个shared_ptr都是使用了同一个原生指针进行初始化,应该是指向同一块内存才对,但事实
上采用这种初始化方式,把p赋值给pB后,pA所管理的引用计数,并不会随之增加一,因为该引用计数值不是一个静态变量
,不是每个类对象都操纵同一个引用计数值变量。同样的,下面的赋值方法也不行:

 1void main()
 2{
 3 int* p = new int;
 4 boost::shared_ptr<int> pA =  boost::shared_ptr<int>(p);
 5 boost::shared_ptr<int> pB = boost::shared_ptr<int>(p);
 6
 7 cout<<"object count = "<<pA.use_count()<<endl;
 8 cout<<"object count = "<<pB.use_count()<<endl;
 9}

10
11

所以,如果想在两个不同的类中管理一个相同类型的shared_ptr变量,即两个对象管理了同一块内存的话,可以仿照下面的代码
实现:

 1#include <boost\shared_ptr.hpp>
 2#include <iostream>
 3#include <vector>
 4
 5using namespace std;
 6using namespace boost;
 7
 8class Foo
 9{
10public:
11 Foo()
12 {
13  cout<<"create a Foo object"<<endl;
14 }

15
16 ~Foo()
17 {
18  cout<<"delete a Foo Object"<<endl;
19 }

20}
;
21
22typedef boost::shared_ptr<Foo> FooPtr;
23
24class TestClassA
25{
26public:
27 void SetFooPtr( const FooPtr& pi)
28 {
29  p = pi;
30  cout<<"object count = "<<p.use_count()<<endl;
31 }

32
33 inline FooPtr& GetFooPtr()
34 {
35  return p;
36 }

37
38private:
39 FooPtr p;
40}
;
41
42class TestClassB
43{
44public:
45 void SetFooPtr( const FooPtr& pi )
46 {
47  p = pi;
48  cout<<"object count = "<<p.use_count()<<endl;
49 }

50
51private:
52 FooPtr p;
53}
;
54
55void main()
56{
57 Foo* pFoo = new Foo;
58 TestClassA a;
59 TestClassB b;
60
61 a.SetFooPtr( FooPtr(pFoo) );
62 b.SetFooPtr( a.GetFooPtr() );
63}

64
posted on 2011-04-20 16:22 游戏研究院 阅读(2093) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理