class TestObj
{
public:
TestObj()
{
cout << "TestObj()\n";
}
~TestObj()
{
cout << "~TestObj()执行\n";
}
void showMsg()
{
cout << "showMsg()\n";
}
};
class ManageObj
{
public:
ManageObj(TestObj *pObj) :m_pObj(pObj)
{
}
~ManageObj()
{
if (m_pObj)
{
delete m_pObj;
m_pObj = NULL;
}
}
TestObj*GetObj()
{
return m_pObj;
}
protected:
private:
TestObj *m_pObj;
};
void main()
{
{
ManageObj MO(new TestObj);
MO.GetObj()->showMsg();
//ManageObj Mb(MO);
}
system("pause");
}
结果:

接着改变main()
void main()
{
{
ManageObj MO(new TestObj);
MO.GetObj()->showMsg();
ManageObj Mb(MO);//注意
Mb.GetObj()->showMsg();
}
system("pause");
}
结果:

所以一般RALL对象在复制自己时,应该一并复制它所管理的对象。我个人推介RALL对象就不要自己复制自己了。所以增加如下类:
class UnCopyAble
{
protected:
UnCopyAble() = default;
~UnCopyAble() = default;
private:
UnCopyAble(const UnCopyAble&);
UnCopyAble&operator=(UnCopyAble &o);
};
class ManageObj:private UnCopyAble
{
...
}
结果:直接在编译期间就扼杀了。


本文通过C++代码示例讲解了智能指针(ManageObj)在对象复制过程中的问题,强调了深拷贝与浅拷贝的区别。当ManageObj对象被复制时,如果不实现深拷贝,会导致原始对象在析构时被意外删除。为避免这种情况,文章推荐使用不可复制(UnCopyAble)基类来禁止ManageObj的复制,确保对象管理的正确性。
1259

被折叠的 条评论
为什么被折叠?



