你也可以结合上面两种方式,如: 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作为参数呢?
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
一、产生的原因: unique_ptr的产生,就是为了解决,raw pointer 的new和delete配对使用问题。...Foo... // reset之后 生成新的的Foo Calling delete for Foo object... // 指定的删除函数D ~Foo... // 调用旧Foo的析构函数 Release...内部存储一个 raw pointer,当unique_ptr析构时,它的析构函数将会负责析构它持有的对象。...2.提供了operator*()和operator->()成员函数,像 raw pointer 一样,我们可以使用*解引用unique_ptr,使用->来访问unique_ptr所持有对象的成员。...3.并不提供 copy 操作(这里指的是copy构造和赋值构造),这是为了防止多个unique_ptr指向同一对象。但却有一个例外:可以从函数中返回一个unique_ptr。
无法进行左值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 管理的对象
《为何优先选用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的区别 首先最明显的区别自然是它们一个是专享对象,一个是共享对象。
C++的智能指针是一种特殊的指针类型,它能够自动管理内存资源,避免常见的内存泄漏和多次释放等问题。C++11引入了三种主要的智能指针:unique_ptr、shared_ptr和weak_ptr。...不可拷贝:unique_ptr是不可拷贝的,即不能进行复制构造和赋值操作。这是为了确保独占所有权的特性,防止多个指针同时管理同一个对象的内存。...可自定义删除器:unique_ptr可以通过模板参数来指定一个删除器(deleter)函数对象,用于在释放内存时执行额外的清理操作。...unique_ptr超出作用域时会自动释放内存,同时调用自定义删除器 return 0; } 常见成员函数 operator*:解引用操作符,用于获取 unique_ptr 所指向对象的引用。...reset:重置 unique_ptr,释放当前所管理的对象并接管新的对象。 release:释放对所管理对象的控制权,并返回该指针的裸指针。 swap:交换两个 unique_ptr 的内容。
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添加、超出范围或重置时增加和减少引用计数,当引用计数达到零时,控制块将删除内存资源和自身。
》和《从lock_guard来说一说C++常用的RAII》。...要实现自动回收的对象池,首先要了解unique_ptr和shared_ptr都可以自定义删除器,也就是说,比如当从对象池获取到的对象是用智能指针包裹的,一般默认的删除器为delete,那我们可以自义定删除器为...而unique_ptr由于是独占语义,提供了一种简便的方法方法可以实现修改删除器,所以用unique_ptr是最适合的。...std::list> m_lObjects; //....... }; 可变函数参数完美转发 不同的对象,可能使用的构造函数参数也不同,那么当调用GetObject...对象池的数量是否要设置一个上限或者下线 对象池重复利用,当取出来后要注意,是不是要对对象做一次reset之类的操作,防止对象上一次的调用残留数据对本地调用构成影响,这个要根据自己对象的特点去进行相应的reset
众所周知,C#和java中不需要开发人员自己释放内存,对象引用计数为零后.Net和Java虚拟机会对对象进行自动回收,从而防止内存泄露;但是C++语言中,在堆上分配的内存必须自己去管理,不用的时候要自己释放...在实际编程时,有三种智能指针可供使用,分别是:std::shared_ptr、std::unique_ptr和std::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
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:指向
// 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
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:
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对象
目前C++11主要支持的智能指针为以下几种:unique_ptr、shared_ptr和weak_ptr。...reset() 释放并销毁原生指针。如果参数为一个新指针,将管理这个新指针。...unique_ptr有两个模板参数,分别为_Tp和_Dp。 _Tp表示原生指针的类型。 _Dp则表示析构器,开发者可以自定义指针销毁的代码。...unique_ptr(pointer __p) noexcept : __ptr_(__p) {} // 原生指针和析构器的构造函数,用这两个参数初始化__ptr_,当前析构器为左值引用 unique_ptr...// 通过reset()方法进行对象的销毁~unique_ptr() { reset(); } (二)shared_ptr shared_ptr与unique_ptr最核心的区别就是比unique_ptr
通常 unique_ptr 就是简单的对裸指针封装,并且禁用拷贝和赋值:template>...在 unique_ptr 内部会保存类型为 T* 和 Deleter 的成员 ,分别表示保存的裸指针和删除器。...ptr;因此可以对这个问题做定性:并不是 unique_ptr 需要知道析构函数,而是 unique_ptr 的默认删除器 Deleter 需要明确知道类型的析构函数。...unique_ptr 相当于在编译时绑定了删除器。shared_ptr 保存的是一个控制块的指针。控制块包含的就是一个引用计数和一个原来对象的裸指针。...控制块中初始化的指针是 nullptr,在运行时为其赋值,也可以通过 reset 修改。类似于虚函数,shared_ptr 相当于在运行时绑定了删除器。
在现代 C + + 编程中,标准库包含智能指针,智能指针可处理对其拥有的内存的分配和删除,这些指针用于帮助确保程序不会出现内存和资源泄漏,并具有异常安全。...资源(堆内存、文件句柄、套接字等)应由对象“拥有”。 该对象在其构造函数中创建或接收新分配的资源,并在其析构函数中将此资源删除。...unique_ptr 没有拷贝构造函数,因此不能用于赋值。该指针最常用的情况是单例模式和编译防火墙的封装。...2,作为函数参数传递时,请传递引用。因为作为值传递时,将产生大量无意义的引用计数。 3,共享所有权性质的对象往往比限定作用域的对象生存时间更久、资源开销更大,尤其是多线程下。...make_shared如果对象需要自定义删除器,则不能使用,因为无法将删除器作为参数传递。
智能指针对象 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 函数或对其执行赋值操作。
---- 测试 & 调试 测试 某一个模块的代码我们写完后需要进行测试,项目中有用GTest写好的测试程序,将第二个参数的**DISABLE_**前缀去掉即可运行。...auto InsertChildNode(char key_char, std::unique_ptr &&child) -> std::unique_ptr *...,return nullptr 反之,返回指向对应节点的unique_ptr 指针 std::unique_ptr * GetChild(char key_char); 根据给定的key_char...// b是 unque_Ptr* auto b = & a; // 注意b就是一个普通的指针,类似于int* 不要混淆了,以为它是unique_ptr b->reset(new int(23...不传参数会将对应内存提前释放。
“智能”指的是使用者不需要关注什么时候是否需要删除这块new出来的内存,内存管理由指针内部自动删除 1.1 范畴 C++11智能指针的范畴包括 类型unique_ptr, shared_ptr和weak_ptr...当讨论到对象是否能被释放,我们遵循一个标准:shared_count是否为0决定了删除managed_object,weaked_ptr和shared_ptr是否同时为0决定删除manager_object...\n"; } 一些有用的使用方式,可以使用if(p)判断一个unique_ptr是否拥有某个对象,使用reset()成员函数或者=nullptr进行删除。...unique_ptr意味着如果需要进行对象的转移,可以使用move语义进行。...是rvalue类型,所以这里可以利用return特性进行unique_ptr的move和reassign std::unique_ptr createTest() { std::unique_ptr
可以在资源(原生指针对应的对象)生命周期结束时自动释放内存。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用于管理多个对象共享所有权的情况,它可以拷贝和移动。
领取专属 10元无门槛券
手把手带您无忧上云