C++ 智能指针使用注意事项

本文讨论了C++智能指针的使用注意事项,包括避免使用auto_ptr,使用unique_ptr管理动态数组,理解unique_ptr与shared_ptr的转换限制,谨慎使用get和release方法,避免静态分配对象初始化智能指针,以及在对象内部正确使用shared_from_this。同时强调了使用make函数初始化智能指针的效率和异常安全性,以及避免共享对象循环引用和类型转换错误。
摘要由CSDN通过智能技术生成
  1. 不使用auto_ptr。

  2. unique_ptr可以指向动态数组。因为unique_ptr有unique_ptr<T[]>重载版本,销毁动态对象时调用delete[]:

    class A{
         };
    unique_ptr<A[]> unique_ap(new A[1]{
         A()});
    
  3. 使用unique_ptr,当需要共享对象所有权时,依然可以将其转化为shared_ptr,但反过来则不行。

    class A{
         };
    unique_ptr<A> a(new A("unique_ptr"));
    shared_ptr<A> b = move(a);
    //a = move(b);  // 报错
    //a.reset(b.get());  // 运行错误
    cout<<a.get()<<endl;
    
  4. 使用shared_ptr需要消耗更多的资源,shared_ptr需要维护一个指向动态内存对象的线程安全的引用计数器以及背后的一个控制块,这使它比unique_ptr更加复杂。

  5. 共享对象所有权也许并非你的本意,但使用shared_ptr有可能造成其他程序员无意间通过赋值给另一个共享指针而修改了你共享出来的对象。

  6. 不要使用静态分配对象的指针初始化智能指针,否则,当智能指针本身被撤销时,它将试图删除指向非动态分配对象的指针,导致未定义的行为。

    A a();//全局变量
    
    int main() {
         
        A b();//局部变量
    	//unique_ptr<A> pa(&a); // 运行错误
        //unique_ptr<A> pa(&b); // 析构两次
    }
    
  7. unique_ptr可以作为函数返回值。

    尽管unique_ptr无拷贝语义,但提供了移动语义,所以可作为函数返回值。

    class 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值