首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为何优先选用unique_ptr而不是裸指针?

你也可以结合上面两种方式,如: std::unique_ptr up;//声明空unique_ptr int *p= new int(1111); up.reset(p);//令up指向新对象... up(d);//空unique_ptr 含义分别如下: T unique_ptr管理对象类型 D 删除器类型 t unique_ptr管理对象 d 删除器函数/function对象等,...reset区别在于,前者会释放控制权,返回裸指针,你还可以继续使用。...unique_ptr不支持普通拷贝赋值 需要特别注意是,由于unique_ptr“独有”特点,它不允许进行普通拷贝或赋值,例如: std::unique_ptr up0; std::...讲吗?既然unique_ptr独享对象,那么就无法直接作为参数,应该怎么办呢? 作为参数 如果函数以unique_ptr作为参数呢?

1.7K00

MSVC std::unique_ptr 源码解析

TestClass(1, 2)); 在 c++ 14 及以上,可以使用 std::make_unique 来更方便地构造 std::unique_ptr参数列表需匹配创建对象构造函数: std::...// destructor // block end 比较重要一点是 std::unique_ptr 删除了拷贝构造,所有它对对象所有权是独享,你没有办法直接将 std::unique_ptr...unique_ptr; 这里模板参数 _Ty 是保存对象类型,_Dx 是删除器类型,默认为 default_delete,下面是具体定义: template struct...) noexcept { reset(); return *this; } 主要是针对空指针处理,当使用空指针进行构造赋值时候,相当于把 std::unique_ptr 重置。...总结 std::unique_ptr 有两个定义,分别针对普通类型和数组类型 std::unique_ptr 第二个模板参数删除器,不传递情况下使用是 default_delete std::unique_ptr

1.5K10
您找到你想要的搜索结果了吗?
是的
没有找到

C++智能指针

无法进行左值unique_ptr复制构造,也无法进行左值复制赋值操作,但允许临时右值赋值构造赋值。std::move。把右值转换为左值。...T数组对象 unique_ptr up(); //空unique_ptr,接受一个D类型删除器D,使用D释放内存 unique_ptr up(new T()); //定义unique_ptr...重置 s3.reset();//参数可以为空、内置指针,先将up所指向对象释放,然后重置up值,将up指向新玩意儿。放一个地址进去指向这个地址对应东西。...(构造类型对象需要参数列表); shared_ptr p4 = make_shared(2); //多个参数以逗号','隔开,最多接受十个 shared_ptr<string...1,p接管对p1指针管控 up.reset(p1,d); //将up重置为p1(值),up管控对象计数减1并使用d作为删除器 交换 std::swap(p1,p2); //交换p1 p2 管理对象

38820

善用shared_ptr,远离内存泄漏(文末福利)

《为何优先选用unique_ptr而不是裸指针?》中说到,如果有可能就使用unique_ptr,然后很多时候对象是需要共享,因此shared_ptr也就会用得很多。...关于参数传值问题,可以参考《传值与传指针》《令人疑惑引用指针》。 reset 调用reset会减少计数: sp.reset() 而如果sp是唯一指向该对象,则该对象被销毁。...存放于容器中shared_ptr 如果你容器中存放是shared_ptr,而你后面又不再需要它时,记得使用erase删除那些不要元素,否则由于引用计数一直存在,其对象将始终得不到销毁,除非容器本身被销毁...*/ delete p;/*不要这样做*/ return 0; } 如果对象不是new分配,请传递删除器 与unique_ptr类似,它可以指定删除器,默认是使用delete。...::shared_ptr up(&socketFd,myClose); return 0; } 与unique_ptr区别 首先最明显区别自然是它们一个是专享对象,一个是共享对象

1.6K10

C++智能指针unique_ptr、shared_ptrweak_ptr

C++智能指针是一种特殊指针类型,它能够自动管理内存资源,避免常见内存泄漏多次释放等问题。C++11引入了三种主要智能指针:unique_ptr、shared_ptrweak_ptr。...不可拷贝:unique_ptr是不可拷贝,即不能进行复制构造赋值操作。这是为了确保独占所有权特性,防止多个指针同时管理同一个对象内存。...可自定义删除器:unique_ptr可以通过模板参数来指定一个删除器(deleter)函数对象,用于在释放内存时执行额外清理操作。...unique_ptr超出作用域时会自动释放内存,同时调用自定义删除器 return 0; } 常见成员函数 operator*:解引用操作符,用于获取 unique_ptr 所指向对象引用。...reset:重置 unique_ptr,释放当前所管理对象并接管新对象。 release:释放对所管理对象控制权,并返回该指针裸指针。 swap:交换两个 unique_ptr 内容。

40120

智能指针详解

return 0; } 多线程下对象析构问题 在多线程环境下,对象析构问题需要特别注意,因为多个线程可能同时访问操作同一个对象。如果多个线程同时尝试析构同一个对象,可能会导致对象被多次删除。...它提供了独占所有权语义,即同一时间只能有一个std::unique_ptr拥有对对象所有权。当std::unique_ptr被销毁或重置时,它会自动释放所拥有的对象,并回收相关内存。...std::unique_ptr支持所有权转移,可以通过move将一个std::unique_ptr实例所有权转移到另一个实例。这种所有权转移可以通过移动构造函数移动赋值运算符来实现。...如果参数为一个新指针,将管理这个新指针 a2.reset(new Obj()); // 没有参数,以下两条语句等价 a2.reset(); //释放并销毁原有对象 a2 = nullptr; 参考官方文档...所有实例均指向同一个对象,并共享资源与一个控制块。每当新shared_ptr添加、超出范围或重置时增加减少引用计数,当引用计数达到零时,控制块将删除内存资源自身。

19840

对象使用场景以及自动回收技术

《从lock_guard来说一说C++常用RAII》。...要实现自动回收对象池,首先要了解unique_ptrshared_ptr都可以自定义删除器,也就是说,比如当从对象池获取到对象是用智能指针包裹,一般默认删除器为delete,那我们可以自义定删除器为...而unique_ptr由于是独占语义,提供了一种简便方法方法可以实现修改删除器,所以用unique_ptr是最适合。...std::list> m_lObjects; //....... }; 可变函数参数完美转发 不同对象,可能使用构造函数参数也不同,那么当调用GetObject...对象数量是否要设置一个上限或者下线 对象池重复利用,当取出来后要注意,是不是要对对象做一次reset之类操作,防止对象上一次调用残留数据对本地调用构成影响,这个要根据自己对象特点去进行相应reset

1K40

【C++11】 使用C++11解决内存泄露--智能指针

众所周知,C#java中不需要开发人员自己释放内存,对象引用计数为零后.NetJava虚拟机会对对象进行自动回收,从而防止内存泄露;但是C++语言中,在堆上分配内存必须自己去管理,不用时候要自己释放...在实际编程时,有三种智能指针可供使用,分别是:std::shared_ptr、std::unique_ptrstd::weak_ptr。...运行结果如下: a and p point to the same location 10 10 10 1.3 指定指针删除器 智能指针在初始化时可以指定删除器,在指针计数为零时,自动调用指定删除器从而释放指针指向内存存...(new T(std::foeward(args)...)); } 2.1 unique_ptr使用方法 下面的代码通过reset方法实现独占指针赋值使用: int main ()...{ std::unique_ptr up; up.reset (new int); *up=5; std::cout << *up << '\n'; up.reset

63510

c++动态内存

double free 和解引用非法内存,但是最好使用make_shared代替shared_ptr(new int() ) (2)管理           shared_ptr在调用一次拷贝构造函数时(传对象参数...类似的函数 // 观察编译器如何诊断unique_ptr出现赋值,拷贝这种错误 #include #includeusing namespace std; int main...// use of deleted function    unique_ptrp2 = uPtr; // use of deleted function }       u.reset...(q),如果reset不为空,则会先把u指向内容释放掉,再让u管理内存q 不能拷贝赋值unique_ptr有一个列: 思考:为什么shared_ptr没有release函数 因为shared_ptr...是可共享,而且每个shared_ptr副本都可以delete指向对象,而       unique_ptr不能共享内存,所以要由对应unique_ptr释放内存      weak_ptr:指向

51820

C++ 智能指针最佳实践&源码分析

// a1 拥有指针 } std::unique_ptr a2(a1.release());//常见用法,转义拥有权 a2.reset(new A());//释放并销毁原有对象,持有一个新对象...a2.reset();//释放并销毁原有对象,等同于下面的写法 a2 = nullptr;//释放并销毁原有对象 2.2 shared_ptr 与unique_ptr唯一所有权所不同是,shared_ptr...unique_ptr有两个模板参数,分别为_Tp_Dp。 _Tp表示原生指针类型。 _Dp则表示析构器,开发者可以自定义指针销毁代码。...__ptr_   explicit unique_ptr(pointer __p) noexcept : __ptr_(__p) {}   // 原生指针析构器构造函数,用这两个参数初始化__ptr...// 通过reset()方法进行对象销毁 ~unique_ptr() { reset(); } 4.2 shared_ptr shared_ptr 与unique_ptr最核心区别就是比unique_ptr

1.6K31

C++智能指针原理实现

2.1 auto_ptr auto_ptr是通过由 new 表达式获得对象,并在auto_ptr自身被销毁时删除对象智能指针,它可用于为动态分配对象提供异常安全、传递动态分配对象所有权给函数从函数返回动态分配对象...;   (2) release:释放被管理对象所有权,将内部指针置为空,返回内部对象指针,此指针需要手动释放;   (3) reset:销毁内部对象并接受新对象所有权;   (4) operator...:返回用于析构被管理对象7删除器;   (3) swap:交换所管理对象;   (4) reset:替换所管理对象;   (5) release:返回一个指向被管理对象指针,并释放所有权;   ...(6) operator bool:检查是否有关联被管理对象;   (7) operator=:为unique_ptr赋值;   (8) operator*operator->:解引用存储对象指针...1.不要使用std::auto_ptr;   2.当你需要一个独占资源所有权指针,且不允许任何外界访问,请使用std::unique_ptr;   3.当你需要一个共享资源所有权指针,请使用std:

49830

《C++Primer》第十二章 动态内存

bool empty() const { return data->empty(); } // 添加删除元素 void push_back(const std::string &t)...reset接收一个可选指针参数,令unique_ptr重新指向给定指针,如果unique_ptr不为空,它原来指向对象被释放。...return ret; } 类似于shared_ptr,unique_ptr默认情况下使用delete释放它指向对象,我们重载一个删除器,但是unique_ptr管理删除方式shared_ptr...重载一个unique_ptr删除器会影响到unique_ptr类型一级如何构造(或reset)该类型对象。...与重载关联容器比较操作类似,在创建或reset一个unique_ptr对象时必须提供一个指定类型可调用对象作为删除器: // p指向一个ObjT类型对象,并使用一个delT类型对象来释放objT对象

1.3K10

shared_ptr unique_ptr 深入探秘

通常 unique_ptr 就是简单对裸指针封装,并且禁用拷贝赋值:template>...在 unique_ptr 内部会保存类型为 T*  Deleter 成员 ,分别表示保存裸指针删除器。...ptr;因此可以对这个问题做定性:并不是 unique_ptr 需要知道析构函数,而是 unique_ptr 默认删除器 Deleter 需要明确知道类型析构函数。...unique_ptr 相当于在编译时绑定了删除器。shared_ptr 保存是一个控制块指针。控制块包含就是一个引用计数一个原来对象裸指针。...控制块中初始化指针是 nullptr,在运行时为其赋值,也可以通过 reset 修改。类似于虚函数,shared_ptr 相当于在运行时绑定了删除器。

22610

【Example】C++ 标准库智能指针 unique_ptr 与 shared_ptr

在现代 C + + 编程中,标准库包含智能指针,智能指针可处理对其拥有的内存分配删除,这些指针用于帮助确保程序不会出现内存资源泄漏,并具有异常安全。...资源(堆内存、文件句柄、套接字等)应由对象“拥有”。 该对象在其构造函数中创建或接收新分配资源,并在其析构函数中将此资源删除。...unique_ptr 没有拷贝构造函数,因此不能用于赋值。该指针最常用情况是单例模式编译防火墙封装。...2,作为函数参数传递时,请传递引用。因为作为值传递时,将产生大量无意义引用计数。 3,共享所有权性质对象往往比限定作用域对象生存时间更久、资源开销更大,尤其是多线程下。...make_shared如果对象需要自定义删除器,则不能使用,因为无法将删除器作为参数传递。

96720

C++智能指针学习(一)

智能指针对象 ap1 ap2 均持有一个在堆上分配 int 对象,其值均是 8,这两块堆内存均可以在 ap1 ap2 释放时得到释放。这是 std::auto_ptr 基本用法。...分析:上述代码中分别利用拷贝构造(ap1 => ap2) 赋值构造(ap3 => ap4)来创建新 std::auto_ptr 对象,因此 ap1 持有的堆对象被转移给 ap2,ap3 持有的堆对象被转移给...最后,up1 up2 不再持有堆内存引用,变成一个空智能指针对象。...另外,std::unique_ptr 有几个常用函数如下: void reset(pointer p = pointer()) 释放当前由 unique_ptr(如果有)管理指针并获得参数 p(参数...这个调用并不会销毁托管对象,但是将 unique_ptr 对象管理指针解脱出来。如果要强制销毁所指向对象,请调用 reset 函数或对其执行赋值操作。

70720

基于C++,手把手教你实现智能指针管理功能

“智能”指的是使用者不需要关注什么时候是否需要删除这块new出来内存,内存管理由指针内部自动删除 1.1 范畴 C++11智能指针范畴包括 类型unique_ptr, shared_ptrweak_ptr...当讨论到对象是否能被释放,我们遵循一个标准:shared_count是否为0决定了删除managed_object,weaked_ptrshared_ptr是否同时为0决定删除manager_object...\n"; } 一些有用使用方式,可以使用if(p)判断一个unique_ptr是否拥有某个对象,使用reset()成员函数或者=nullptr进行删除。...unique_ptr意味着如果需要进行对象转移,可以使用move语义进行。...是rvalue类型,所以这里可以利用return特性进行unique_ptrmovereassign std::unique_ptr createTest() { std::unique_ptr

21500

【重学C++】02 脱离指针陷阱:深入浅出 C++ 智能指针

可以在资源(原生指针对应对象)生命周期结束时自动释放内存。C++标准库中,提供了两种最常见智能指针类型,分别是std::unique_ptr std::shared_ptr。...MyClass* naked_ptr = ptr1.get();std::cout << *ptr2 << std::endl; // 输出 10释放/重置所管理对象使用reset函数可以释放unique_ptr...std::endl;释放/重置所管理对象可以使用reset函数来释放/重置shared_ptr所管理对象。...如果reset指定了新资源指针,则需要重新设置 data ref_count,并将计数器初始化为 1。...unique_ptr用于管理独占式所有权对象,它不能拷贝但可以移动,是最轻量级最快智能指针。shared_ptr用于管理多个对象共享所有权情况,它可以拷贝移动。

23100
领券