C++常用类 shared_ptr

本文探讨了C++中`shared_ptr`的使用,强调了资源管理的重要性,特别是在异常处理中避免内存泄漏。文章还讨论了`unCopyable`类的赋值操作符改进,提倡使用`copy-and-swap`技术。此外,解释了C++的隐式转换、`explicit`关键字的作用,并提到了对象管理资源以确保在异常情况下正确释放。最后,指出了`shared_ptr`在复制和赋值时如何处理引用计数,以及定义类时需要考虑的对象切割、传值与传引用以及非局部静态对象交互的问题。
摘要由CSDN通过智能技术生成

unCopyable类

class unCopyable{
protected:
unCopyable(){}
~unCopyable(){}
private:
 unCopyable(const unCopyable &);
unCopyable & operator=(const unCopyable&);
}
class home :private unCopyable{}

注意上面的基类的protected类型的构造函数和析构函数,子类是private继承。private继承是实现继承。

赋值操作符:

widget & widget::operator=(const  widget& rh){

 if(this == &rh)

return *this;

delete pb;

pb = new Bitmap(*rh.pb);

reruen *this;

}

这种函数虽然考虑了两者相同的情况,但是没有考虑当new操作发生异常时 的情况。当异常是,pb会指向已经释放的内存,导致不确定行为。

更好的方式是

widget & widget::operator=(const  widget& rh){

Bitmap* porig = pb;

pb = new Bitmao(*rh.pb);

delete porig;

return *this;

}

这里即使两者相同,也不会有问题,只不过多做了一次拷贝,对效率有影响。我们可以考虑将判断语句加进去,但是判断语句会使代码变大,产生新的分支流,这两点都会降低CPU的效率。所以我们应该考虑自我赋值的发生频率有多高。

还有一个替代方案是copyandswap技术:

class widget{

private:

void swap(const widget&rh){}

public:

widget &

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值