首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

给对象赋值的有关问题

2013-07-09 
给对象赋值的问题。class autoptr{Person* pint cntpublic:autoptr(Person* p):p(p),cnt(1){}autoptr(con

给对象赋值的问题。
  class autoptr{
Person* p;
int cnt;
public:
autoptr(Person* p):p(p),cnt(1){}
autoptr(const autoptr& a):p(a.p){++cnt;}
~autoptr(){if(cnt==1)delete p;}
};
int main()
{
autoptr a = new Person;//a.cnt = 1
autoptr b = a;//b.cnt = 2
autoptr c = a;//c.cnt = 2
}
但是运行结果 b.cnt  c.cnt 是随机值  求解释
[解决办法]
不过你写的这个计数指针不会正常工作,因为计数器有多份:


x->a = new Person;//x->a.cnt = 1
y->b = x->a;//y->b.cnt = 2(假设你已经修改了前面的错误),但这时x->a.cnt依然等于1
z->c = x->a;//x->a.cnt = 2同上
delete x;//调用a的析构函数,由于x->a.cnt为1,x->a.p被delete,尽管它还在被b和c使用。


正确的引用计数指针的计数应该是动态分配的,赋值或拷贝构造时把它的指针一同赋值,这样才能让管理相同指针的autoptr共享同一计数器。

当然或许这不是计数指针,逻辑就是当cnt等于1的autoptr负责delete,而其它autoptr只是引用,那就当我没说。

不过无论哪种逻辑,没有定义拷贝赋值操作符都是不可以的。

热点排行