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而直接修改引用计数的做法,因为这是极危险的行为。

  • 相关阅读:
    WebApi调用及发布
    List<T> 去除重复数据
    C#正则表达式去除XML标签
    SSIS 发送邮件
    域登录验证.net版
    js获取select选中的值
    ionic常见错误
    mac安装brew homebrew
    flutter ios编译报错集
    dart 格式化输出
  • 原文地址:https://www.cnblogs.com/wantnon/p/4508246.html
Copyright © 2011-2022 走看看