怎么进行c++智能指针unique_ptr的使用(C++,unique ptr,开发技术)

时间:2024-05-05 07:20:07 作者 : 石家庄SEO 分类 : 开发技术
  • TAG :

    1.为什么需要unique_ptr

    与shared_ptr作用类似,需要解决内存泄漏的问题,但是却不需要使用shared_ptr的引用计数,所以为了减少消耗,就需要一个这样的智能指针。但是使用已被废弃的auto_ptr的话就会有新的问题,auto_ptr在使用过程中如果被拷贝构造或者赋值的话,被复制的auto_ptr就失去了作用,这个时候就需要在auto_ptr的基础上禁用拷贝构造以及赋值操作,也就成了unique_ptr。

    2.什么是unique_ptr

    一个unique_ptr独享它指向的对象。也就是说,同时只有一个unique_ptr指向同一个对象,当这个unique_ptr被销毁时,指向的对象也随即被销毁。使用unique_ptr需要引入<memory.h>

    3.unique_ptr特性

    unique_ptr禁用了拷贝构造以及赋值操作,也就导致了下面的这些操作无法完成。

    voidtestFunction(std::unique_ptr<Test>t){t->getString();}voidfeatures(){//Disablecopyfromlvalue.//unique_ptr(constunique_ptr&)=delete;//unique_ptr&operator=(constunique_ptr&)=delete;//不能进行拷贝构造以及赋值运算,也就表示不能作为函数参数传递std::unique_ptr<Test>t(newTest);std::unique_ptr<Test>t2=t;//编译报错std::unique_ptr<Test>t3(t);//编译报错testFunction(t);//编译报错}

    4.如何使用unique_ptr

    4.1简单使用

    voidsimpleUse(){Test*test=newTest;std::unique_ptr<Test>t(test);qDebug()<<test<<"获取原始指针"<<t.get()<<endl;//t.release();//释放其关联的原始指针的所有权,并返回原始指针,没有释放对象//t.reset();//释放对象t->getString();std::unique_ptr<Test>t2=std::move(t);//交换使用权到t2;t2->getString();}

    怎么进行c++智能指针unique_ptr的使用

    4.2指向数组

    和shared_ptr需要注意的地方一样,指向数组时要注意模板书写的方式,以及如何使用自定义删除器

    错误写法:会导致内存泄露

    voidcustomRemover(){std::unique_ptr<Test>t(newTest[5]);}

    怎么进行c++智能指针unique_ptr的使用

    正确写法:

    voidcustomRemover(){std::unique_ptr<Test[]>t(newTest[5]);std::unique_ptr<Test,void(*)(Test*)>p2(newTest[5],[](Test*t){delete[]t;});}

    5.unique_ptr需要注意什么

    不要多个unique_ptr指向同一个对象
    例如:

    voidrepeatPointsTo(){Test*test=newTest;std::unique_ptr<Test>t(test);std::unique_ptr<Test>t2(test);//两个unique_ptrzhi'xi指向同一个对象,会导致这个对象被析构两次,导致问题出现}

    怎么进行c++智能指针unique_ptr的使用

    会导致对象会被多次析构,导致崩溃

     </div> <div class="zixun-tj-product adv-bottom"></div> </div> </div> <div class="prve-next-news">
    本文:怎么进行c++智能指针unique_ptr的使用的详细内容,希望对您有所帮助,信息来源于网络。
    上一篇:怎样通过Vue实现@人的功能下一篇:

    5 人围观 / 0 条评论 ↓快速评论↓

    (必须)

    (必须,保密)

    阿狸1 阿狸2 阿狸3 阿狸4 阿狸5 阿狸6 阿狸7 阿狸8 阿狸9 阿狸10 阿狸11 阿狸12 阿狸13 阿狸14 阿狸15 阿狸16 阿狸17 阿狸18