拷贝带引用计数的对象时要注意的问题

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

原文地址:https://www.cnblogs.com/wantnon/p/4508246.html