zoukankan      html  css  js  c++  java
  • 拷贝带引用计数的对象时要注意的问题

    设Cobj是引用计数对象的基类。

    class CmyObj:public Cobj{

    public:

      int m_a;

      int m_b;

      int m_c;

      ...

    };

    设现在有一个CmyObj类的对象myObjA,想对其进行复制,则下面方法是错误的:

    法1:(错误方法)

    CmyObj*myObjB=new CmyObj();

    myObjB->autorelease();

    *myObjB=*myObjA;

    此方法之所以是错误的,是因为我们希望复制出来的myObjB是一个引用计数“干净”的对象(即autorelease对象)。但像上面这样拷贝,myObjA的引用计数也被拷贝给myObjB了,这将导致myObjB在以后的正常使用过程中无法正确释放。

    因此正确的做法是:

    法2:

    CmyObj*myObjB=new CmyObj();

    myObjB->autorelease();

    myObjB->m_a=myObjA->m_a;

    myObjB->m_b=myObjA->m_b;

    myObjB->m_c=myObjA->m_c;

    ....

    或者 法3:

    CmyObj*myObjB=new CmyObj();

    myObjB->autorelease();

    *myObjB=*myObjA;

    myObjB->m_retainCount=1;//强制将引用计数设为1

    法2虽然笨,但总不至于像法1那样既严重内存泄漏又几乎永远都查不出来。

    法3虽然理论上可行,但怀疑是否有引擎提倡这种绕过retain/release/autorelease而直接修改引用计数的做法,因为这是极危险的行为。

  • 相关阅读:
    poj 3667 Hotel
    codevs 1380 没有上司的舞会
    bzoj 4033 树上染色
    bzoj 1179 [APIO 2009]Atm(APIO水题)
    poj 1741 Tree
    bzoj 3600 没有人的算术
    poj 3233 Matrix Power Series
    hdu 2256 Problem of Precision -矩阵快速幂
    [矩阵十题第七题]vijos 1067 Warcraft III 守望者的烦恼 -矩阵快速幂
    main函数递归
  • 原文地址:https://www.cnblogs.com/wantnon/p/4508246.html
Copyright © 2011-2022 走看看