博客首页 注册 建议与交流 排行榜 加入友情链接
推荐 投诉 搜索: 帮助

sislcb

寻找自己
sislcb.cublog.cn
剖析C++标准库智能指针(std::auto_ptr) (3)
3.auto_ptr高级使用指南
     
      a.类成员auto_ptr,禁止构造函数以构建"完全对象"

 

Programme1:
        
struct Structx{
               
int m_Idata;
               
char m_CHRdata;
               
/* and so on */
        }
;
        出于对象编程的理念,
        我们将Structx打造成包裹类:
        
class StructWrapper{
        
private:
        Structx
* m_STRTxptr;
        
public:
        StructWrapper():m_STRTxptr(
new Structx){}
        
~StructWrapper(){delete m_SMRTxptr; }
        
public:
        
void Soperator1()/* 针对Structx对象的特性操作 */}
        
void Soperator2()/* 针对Structx对象的特性操作 */}        
        
/*  and so on */
        }

        
        Programme2:
        
class StructWrapper{
        
private:
        auto_ptr
<Structx> m_SMPTRx;
        
public:
        StructWrapper():m_SMPTRAx(
new Structx){}
        
public:
        
void Soperator1()/* 针对Structx对象的特性操作 */}
        
void Soperator2()/* 针对Structx对象的特性操作 */}        
        
/*  and so on */
        }

        
        Programme3:
        StructWrapper::StructWrapper(
const StructWrapper& other)
        : M_SMPTRx(
new Struct(*other.m_SMPTRx)) { }
        StructWrapper
& StructWrapper::operator=(const StructWrapper &other){
        
*m_SMPTRx = *other.m_SMPTRx;
        }
;


                处于对构建于堆中的对象(new Structx)智能维护的需要.
        我们将programme1改造为programme2:
        不错,对象是可以智能维护了.
        对于包裹类(StructWrapper)你是否会有这样的构造或指派操作:
         StructWrapper m_SMPTRWrapper2(m_SMPTRWrapper1);
      
         StructWrapper mSMPTRWrapper2 = m_SMPTRWrapper1;
         那么请注意:
         当你坦然的来一个:M_SMPTRWrapper1->Soperator1();的时候,
         系统崩溃了.
         不必惊讶,所有权还是所有权问题.
         问一下自己:当programme2默认拷贝构造函数作用时,又调用了auto_ptr的
         默认构造函数,那么auto_ptr所有的默认行为都遵循独权策略.对,就这样.
         m_SMPTRWrapper1的对象所有权转移给了m_SMPTRWrapper2.
         M_SMPTRWrapper1->Soperator1();那么操作变成了在NULL上的.
         哦!系统不崩溃才怪.
         那么你需要想,programme3那样利用auto_ptr的提领操作符自己的
         构造"完全对象".

       b.利用const关键字,防止不经意的权限转移
        
         从上面的叙述,你可看出,所有权转移到处可以酿成大祸.
         而对于一般应用来说,独权又是很好的安全性策略.
         那么我们就用const来修饰auto_ptr,禁止不经意的错误.
       
         当然上面提及:并不代表auto_ptr是不可修改的.
         处于需要,从两种const语义,你都可实现修改.

         然,你还希望在函数传入传出auto_ptr那么你可传递auto_ptr的引用,
         那就万无一失了: void fook(const auto_ptr<x>& m_PARAMin);
         在返回后赋予其它时,使用引用是不行的.你得用指针.
         因为引用无论作为lvalue还是rvaluev,都会调用构造或指派函数.


    4.你是否觉得std::auto_ptr还不够完美
     
      在实践中,std::auto_ptr能满足你的需求吗?          
 
      Andrei Alexandrescu在一篇文章中,提及:有关Smart Pointer的技术就像
      巫术.Smart Pointer作为C++垃圾回收机制的核心,它必须足够强大的、具有工业强度和安全性.
      但为了可一劳永逸我们还需要披荆斩棘继续探索.

      下面在需求层面上,我们思索一下我们的智能指针还需要些什么?
 
        a. std::auto_ptr 能够处理数组吗?我们可以用智能指针来管理其它的资源吗?
           譬如一个线程句柄、一个文件句柄 and so on !
        b. 对于我们的对象真的永远实行独权政策吗?
        c. Our 智能指针还需要在继承和虚拟层面上发挥威力 !
        d. 往往,需要扩展Our 智能指针的功能成员函数来满足动态的需要 !
        e. 也许,你需要的还很多.

 原文地址 http://www.cppblog.com/yuanyajie/archive/2006/12/15/16489.html
发表于: 2007-10-25,修改于: 2007-10-25 11:47,已浏览519次,有评论0条 推荐 投诉

给我留言
版权所有 ChinaUnix.net 页面生成时间:6.22967