c++智能指针unique_ptr的使用
程序员文章站
2022-06-23 22:51:37
目录1.为什么需要unique_ptr2.什么是unique_ptr3.unique_ptr特性4.如何使用unique_ptr4.1简单使用4.2指向数组5.unique_ptr需要注意什么1.为什...
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禁用了拷贝构造以及赋值操作,也就导致了下面的这些操作无法完成。
void testfunction(std::unique_ptr<test> t){ t->getstring(); } void features(){ // disable copy from lvalue. // unique_ptr(const unique_ptr&) = delete; // unique_ptr& operator=(const unique_ptr&) = delete; //不能进行拷贝构造以及赋值运算,也就表示不能作为函数参数传递 std::unique_ptr<test> t(new test); std::unique_ptr<test> t2 = t; //编译报错 std::unique_ptr<test> t3(t);//编译报错 testfunction(t);//编译报错 }
4.如何使用unique_ptr
4.1简单使用
void simpleuse(){ test *test = new test; 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(); }
4.2指向数组
和shared_ptr需要注意的地方一样,指向数组时要注意模板书写的方式,以及如何使用自定义删除器
错误写法:会导致内存泄露
void customremover(){ std::unique_ptr<test> t(new test[5]); }
正确写法:
void customremover(){ std::unique_ptr<test[]> t(new test[5]); std::unique_ptr<test, void(*)(test *)> p2(new test[5],[](test *t){ delete []t; }); }
5.unique_ptr需要注意什么
不要多个unique_ptr指向同一个对象
例如:
void repeatpointsto(){ test *test = new test; std::unique_ptr<test> t(test); std::unique_ptr<test> t2(test); //两个unique_ptrzhi'xi指向同一个对象,会导致这个对象被析构两次,导致问题出现 }
会导致对象会被多次析构,导致崩溃
到此这篇关于c++智能指针unique_ptr的使用的文章就介绍到这了,更多相关c++智能指针unique_ptr内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
推荐阅读
-
c/c++ 数组的智能指针 使用
-
c/c++ 智能指针 weak_ptr 使用
-
C++使用Sqlite3,使用CppSQLite3的封装
-
Facebook如何使用"我们"的数据去构建人工智能
-
c++ 拷贝构造函数(重点在内含指针的浅拷贝和深拷贝)
-
OpenCV中的新函数connectedComponentsWithStats使用(python和c++实例)
-
约瑟夫环问题的PHP实现 使用PHP数组内部指针操作函数
-
C++入门之new和delete关键字、静态成员属性与函数、this指针使用介绍
-
C++指针参数是如何传递内存的?
-
Word2003希望使用智能标记,但不希望紫色的虚线下划线出现在文档中。