+ -
当前位置:首页 → 问答吧 → 关于RAII pointer like and value like

关于RAII pointer like and value like

时间:2011-11-30

来源:互联网

C/C++ code

/**--------RAII Template----------**/
/**---Value Like Smart Pointer ---**/
/**template<class T>
class base
{
    public:
    base(const base &orig):pt(new T(*orig.pt)){}
    base(const T &at):pt(new T(at)){}//这里可以,因为他是重新在堆上开辟空间
    base(const T *p):pt(new T(*pt)){}
         base& operator = (const base &orig)
    {
        *pt = *orig.pt;
        return *this;
    }
    ~base(){cout << "called Base's destructor" << endl;delete pt;}
    T* GetRaw()const{return pt;}
    private:
    T *pt;
};**/
/**---Pointer Like Smart Pointer ---**/
template<class T>
class base
{
    public:
    base(T *p):pt(p),use(new int(1)){}
    //base(T &ma):pt(&ma),use(new int(1)){}//--->>对于这个地方用引用就感觉不行了,如果传进来的不是动态分配的就会导致错误
    base(const base &orig):pt(orig.pt),use(orig.use){++*(orig.use);}
    base& operator = (const base &orig)
    {
        ++*(orig.use);
        if(pt != orig.pt)
            Del_pt();
        else
        {
            pt = orig.pt;
            use = orig.use;
        }
    }
    ~base(){Del_pt();}
    private:
    void Del_pt()
    {
        cout << "delete the resource" << endl;
        if(0== --*use)
        {
            delete pt;
            delete use;
        }
    }
    T *pt;
    int *use;
};

资源管理在C++中无处不在,value like and pointer like区别很大,value like没有引入引用计数的概念,很好的避免了多个对象指向同一个资源,它是用重新开辟空间的方式在堆上开辟一段空间来装所要管理的资源的副本,所以如果是动态分配的资源还必须手动的释放资源,value like不会帮你释放,但因为他的这种方式,他很好的避免了自身赋值问题
pointer like引入引用计数的概念,所以他不会重新开辟空间,他似乎只能管理动态分配的资源(这里有待推敲),他避免不了自身赋值问题,而且更重要的是他很难让人知道什么时候释放了资源,尽管他可以保证正确释放,所以一不小心你delete了你new的资源就导致出错。
感觉上这两种资源管理方式都不太完美,value like浪费了很多内存空间,pointer like容易出错,这些都是我的一点理解,不知道有没有更加完美的资源管理方式

作者: qscool1987   发布时间: 2011-11-30


哥发这好的贴怎么能沉,高手们来探讨下

作者: qscool1987   发布时间: 2011-11-30

COW?更麻烦……不管是效率还是安全。

作者: FrankHB1989   发布时间: 2011-11-30

引用 2 楼 frankhb1989 的回复:
COW?更麻烦……不管是效率还是安全。

COW?是什么呢,我刚搜了下,没搜到

作者: qscool1987   发布时间: 2011-11-30

C++primer 关于管理指针成员那一段:
指针成员的管理有三种<1> 常规指针类型, <2> 智能指针类型, <3>值形类型
常规指针类型: 会产生悬空指针,两个指针指向同一个对象,删除一个指针所指的,另一个指针就悬空了;
值形行为的指针:指针所指对象唯一,由每个类对象独立管理;
智能指针:指针所指的对象是共享的,但类能防止指针悬空;它使用一个引用计数类管理一个类产生的对象个数,基本这是比较好的方式;
你说的 自身赋值问题 的问题不了解是什么,但是当你类中使用指针的使用C++三原则要求要自己定义自己的拷贝构造,赋值运算符和析构函数,在拷贝构造函数里面我们会自己定义赋值的行为;
释放资源问题 是由引用计数类来决定的,它是一个辅助的类,C++prime上说它的作为我们定义的类的有元存在的,用来管理我们类产生的的对象;;
你说的不知道什么时候释放资源,objective-c 里面使用的就是引用计数机制,每个类都有一个reference_count属性 销毁对象的时候会先判断引用计数值,不为零不释放它

作者: imstyle1001   发布时间: 2011-11-30