永发信息网

C++ 类中 智能指针 的使用。这个是看的C++primer,在赋值操作符重载函数体里面有一句没看懂……

答案:1  悬赏:20  手机版
解决时间 2021-03-04 16:12
C++ 类中 智能指针 的使用。这个是看的C++primer,在赋值操作符重载函数体里面有一句没看懂……
最佳答案
if ( --ptr->use == 0 ){ //【【这句什么意思????】】】
delete ptr;
}
ptr->use 是用来记录智能指针所对应的真实指针被多少个智能指针给使用了。

比如这个赋值操作符中第一句++rhs.ptr->use;因为传递函数rhs对应的指针需要被新的智能指针使用,所以使用数自增一。而当前智能指针需要更换新的指向值,那么就意味着旧的指向值的使用数要减一,所以有--ptr->use。然后再判断这个值是否已经变成0了,如果为0则意味着就指针已经没有被任何智能指针使用了,所以需要释放其内存,调用delete功能。

函数的参数在实际中是等号的右侧。
如:HasPtr ptr1;
HasPtr ptr2 = ptr1;追问难道说在执行 HasPtr ptr2 = ptr1; 这一句的时候,是先执行HasPtr ptr2;
也就是先用默认构造函数初始化了ptr2,同时也出现了新的智能指针,
之后再用ptr1的各项值赋予给ptr2。那么之前出现的那个智能指针就要计数减一,之后判断删除。

是这样吗?追答呃,抱歉,我写的例子似乎是不对的。
首先这个HasPtr函数式没有默认构造函数的,所以你定义一个HasPtr的变量时,必须要传入对应的参数或者用已经存在的HasPtr来进行拷贝构造。
例子改成:
int *pInt1 = new int;
HasPtr ptr1(pInt, 1); //初始化定义ptr1

如果这时候写一句HasPtr ptr2 = ptr1;这一句其实没有调用等号操作符,调用的是拷贝构造函数HasPtr(const HasPtr &orig);所以我的例子写错了,呵呵。下面继续:

int *pInt2 = new int;
HasPtr ptr2(pInt, 1); //初始化定义ptr2

ptr2 = ptr1; //此时调用了等号操作符进行了复制操作,原本ptr1指向的pInt1使用次数+1,而ptr2初始化时指向的pInt2使用次数-1,判断删除;追问我明白了:
HasPtr a1;
HasPtr a2; //此时相当于有两个智能指针存在。都是调用的默认构造函数
HasPtr a3 = a1; //这时也是存在两个智能指针,调用的是复制构造函数
HasPtr a4; //新智能指针4
a4 = a1; //这时,a4的智能指针变为a1的;而a4的原先的智能指针就会先减一后判断是否应该释放,这时调用的是赋值重载。
是不是这样??

哈哈,看来是了刚想追问追答就是这样
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
浙江温州到洛阳的快递要多久?
对联具有记载历史的功能,是时代的见证。“宣
下列有关激素和氨基酸的叙述,正确的是 ①胰
84浸泡衣服十几小时会不会对身体有伤害还能不
iphone怎么删除搜狗输入法
325×8无缝钢管 20#钢 在温度380℃ 压力1.3MP
胸肌练多了有什么坏处
东莞廉租房在哪
和女生交往多久送玫瑰花比较合适?
农历上那三十日那个字念什么
中国古代一位思想家认为“人之所以异于禽兽者
TFboys王俊凯多高
电化学里面的0.059 2V 后面的2是什么意思
昨日cctv10科教频道我爱发明栏目视频
用油糠加拉丝粉可以钓鱼吗
推荐资讯
家里想装智能家居灯控系统,对灯具本身有没有
我的世界手机版可以下魔祖吗
【english lovers come in please!translatio
井下矿用防爆电话接听没声音是什么原因
以前夫妻同房时很快女的就打到高潮啦,现在怎
Does he have a son.
秋风田在哪里啊,我有事要去这个地方
傅机匠我想知道这个在什么地方
涧泓木业贸易有限公司在哪里啊,我有事要去这
▲数字产品发布的特点有()。A.复制前置化B.
向4L容器中充入0.7mol二氧化硫和0.4mol氧气,4
比喻好女人的词语
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?