Lyt
posts - 16,comments - 61,trackbacks - 0

最近在写表达式树,涉及到一些内存管理的囧事:在构造树的过程中经常要申请内存,一不小心就会内存泄漏,拿几个链表把所有申请内存的指针都记录下来,等程序结束后再一次性释放掉显然不可行,经过提醒于是考虑到智能指针。

智能指针LytPtr通过引用计数来判断是否释放内存。在写LytPtr过程中出现以下问题:

1.用int来记录引用计数,于是控制同一个对象的两个智能指针引用计数可能不同,这显然不正确,举例:

template<typename T>
LytPtr
<T> get(T* t) {return LytPtr<T>(t);}

于是只能用指针int*来记录引用计数。

2.没有意识到引用计数跟控制对象的指针是绑在一起的,在释放控制对象的时候忘记把引用计数也释放掉。

结论:有什么东西绑定在一起就要考虑类。

3.引用计数自减的时候忘记判断引用计数(int*)是否为0,这样在释放没有控制任何对象的智能指针时会出错,因为引用计数初始化为0;

结论:在获得指针所指对象之前,必须首先判断指针是否为空

LytPtr代码如下:

 1template<typename _Type>
 2class LytPtr // 智能指针
 3{
 4private:
 5    struct LytPtrData
 6    {
 7        int Count; //引用计数
 8        _Type* Object; // 智能指针控制对象
 9    }
* Data;
10
11    void Increase()
12    {
13        (Data->Count)++;
14    }

15
16    void Decrease()
17    {
18        if (Data)
19        {
20            (Data->Count)--;
21            if (!(Data->Count))
22            {
23                delete Data->Object;
24                delete Data;
25                Data=0;
26            }

27        }

28    }

29
30public:
31    LytPtr()
32    {
33        Data=0;
34    }

35
36    LytPtr(_Type* Temp)
37    {
38        Data=new LytPtrData;
39        Data->Object=Temp;
40        Data->Count=1;
41    }

42
43    LytPtr(const LytPtr<_Type>& Temp)
44    {
45        Data=Temp.Data;
46        Increase();
47    }

48
49    ~LytPtr()
50    {
51        Decrease();
52    }

53
54    operator bool()const
55    {
56        return Data!=0;
57    }

58
59    LytPtr<_Type>& operator=(_Type* Temp)
60    {
61        Decrease();
62        Data=new LytPtrData;
63        Data->Object=Temp;
64        Data->Count=1;
65        return *this;
66    }

67
68    LytPtr<_Type>& operator=(const LytPtr<_Type>& Temp)
69    {
70        Decrease();
71        Data=Temp.Data;
72        Increase();
73        return *this;
74    }

75
76    bool operator==(_Type* Temp)const
77    {
78        return Data->Object==Temp;
79    }

80
81    bool operator==(const LytPtr<_Type>& Temp)const
82    {
83        return Data==Temp.Data;
84    }

85}
;

 最后,要意识到三个问题:

1.无论如何代码给别人看之前要先跑

2.以后是有可能加班加点的,要提高困的时候的工作效率

3.尽量首先学会在理论上去认识事物,不然等代码写出来再发现就晚了

 

第一次发贴,欢迎各位来喷~

posted on 2009-03-20 13:41 Lyt 阅读(2226) 评论(7)  编辑 收藏 引用 所属分类: 数据结构

FeedBack:
# re: 智能指针LytPtr
2009-03-20 16:26 | LOGOS
喷不出来XD
没看出什么不妥的地方
google一下 share_ptr和weak_ptr
  回复  更多评论
  
# re: 智能指针LytPtr
2009-03-20 18:56 | Lyt
@LOGOS
行,谢哈~  回复  更多评论
  
# re: 智能指针LytPtr
2009-03-21 01:49 | eXile
bool operator==(_Type* Temp)const
实现中有个小bug  回复  更多评论
  
# re: 智能指针LytPtr
2009-03-21 07:58 | Lyt
@eXile
可以具体点告诉我么?  回复  更多评论
  
# re: 智能指针LytPtr
2009-03-21 08:00 | Lyt
@eXile
bool operator==(_Type* Temp)const
{
if (Data) return Data->Object==Temp;
else return false;
}
是这意思?
  回复  更多评论
  
# re: 智能指针LytPtr
2009-03-21 08:09 | Lyt
@eXile
bool operator==(_Type* Temp)const
{
if (Data) return Data->Object==Temp;
else
{
if (Temp) return false;
else return true;
}
}  回复  更多评论
  
# re: 智能指针LytPtr
2012-12-02 14:01 | anonymous jwk
木有考虑多线程啊,亲
自己给自己赋值似乎也会有问题  回复  更多评论
  

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