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

shared_ptr::reset只适用于原始指针吗?

shared_ptr::reset方法不仅适用于原始指针,还适用于其他shared_ptr实例或者weak_ptr实例。该方法用于重置shared_ptr的指向,即将其指向一个新的对象或者将其置为空。

使用shared_ptr::reset方法可以实现以下功能:

  1. 重置shared_ptr指向一个新的对象:可以将shared_ptr指向一个新的对象,原来的对象会被释放。例如:shared_ptr<int> ptr(new int(5)); ptr.reset(new int(10)); // 重置指向一个新的int对象
  2. 重置shared_ptr为空:可以将shared_ptr置为空,释放其当前指向的对象。例如:shared_ptr<int> ptr(new int(5)); ptr.reset(); // 重置为nullptr,释放原来的int对象
  3. 重置shared_ptr指向另一个shared_ptr或weak_ptr:可以将一个shared_ptr或weak_ptr赋值给另一个shared_ptr,实现共享所有权或弱引用。例如:shared_ptr<int> ptr1(new int(5)); shared_ptr<int> ptr2(ptr1); // ptr2指向ptr1指向的对象,共享所有权 ptr1.reset(); // 释放ptr1的所有权,但ptr2仍然有效

shared_ptr<int> ptr3(new int(10));

weak_ptr<int> weakPtr(ptr3);

ptr3.reset(); // 释放ptr3的所有权,但weakPtr仍然可以检测到对象是否存在

代码语言:txt
复制

shared_ptr::reset方法的优势:

  1. 安全性:使用shared_ptr::reset方法可以确保资源的正确释放,避免内存泄漏和悬空指针的问题。
  2. 灵活性:可以通过reset方法动态地改变shared_ptr的指向,实现对象的复用或者释放。

shared_ptr::reset方法的应用场景:

  1. 在动态内存管理中,当一个shared_ptr不再需要指向当前对象时,可以使用reset方法将其指向新的对象或置为空,以便及时释放资源。
  2. 在多线程环境下,可以使用reset方法实现线程安全的资源共享和释放。

推荐的腾讯云相关产品和产品介绍链接地址:

  1. 腾讯云云服务器(CVM):https://cloud.tencent.com/product/cvm
  2. 腾讯云云数据库MySQL版:https://cloud.tencent.com/product/cdb_mysql
  3. 腾讯云对象存储(COS):https://cloud.tencent.com/product/cos
  4. 腾讯云人工智能(AI):https://cloud.tencent.com/product/ai
  5. 腾讯云物联网(IoT):https://cloud.tencent.com/product/iot
  6. 腾讯云移动开发(MSS):https://cloud.tencent.com/product/mss
  7. 腾讯云区块链(BCS):https://cloud.tencent.com/product/bcs
  8. 腾讯云元宇宙(Metaverse):https://cloud.tencent.com/product/metaverse

请注意,以上链接仅供参考,具体产品选择应根据实际需求进行评估和决策。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

使用 C++ 智能指针遇到的坑

使用 C++ 智能指针遇到的坑 阅读收益 智能指针目的就是代替原始指针,那么问题来了,原始指针都可以用智能指针代替?...不能 智能指针 unique_ptr、shared_ptr 和 weak_ptr三个,那么问题来了 一个不能代替全部?...但是在实际的使用过程中,很多人都会有这样的问题: 不知道三种智能指针的具体使用场景 无脑使用 shared_ptr 认为应该禁用 raw pointer(裸指针,即 Widget * 这种形式),全部使用智能指针...Guru Questions 1(大师级问题) 既然智指针,能避免内存泄漏问题, 能代替all场景的原始指针?, 为什么发明三个 而不是一个,来一统天下。...unique_ptr 代替全部原始指针? 答:不是的,如果使用不当会造成 core 或者 不执行析构函数。 在类的成员,或者函数参数传递。

2.5K50

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

、辅助函数以及reset方法进行初始化化,代码如下所示: int main () { std::shared_ptr sp; sp.reset (new int); //reset...1.2 获取原始指针 代码中可以使用get方法获取原始指针,如代码所示: int main () { int* p = new int (10); std::shared_ptr a...1.4 使用std::shared_ptr 的注意事项 std::shared_ptr注意事项如下: 不能使用同一个原始指针初始化多个std::shared_ptr 不要在函数实参中创建智能对象指针,主要是因为不同的编译器可能存在不同的约定...有一点需要大家注意的是,智能共享指针可以使用reset函数进行释放。...,做监控使用,用于解决shared_ptr的this指针返回问题和循环引用计数问题。

63710

shared_ptr是线程安全的

画外音 智能指针有2个成员,一个是引用计数是原子的,另外一个原始指针 不是 综合来说 就不是 继续查看文档shared_ptr_thread_safety Examples: 引用计数改变 原子操作...Writing a shared_ptr from two threads // thread A p3.reset(new int(1)); // thread B p3.reset(new int...具体来说,shared_ptr 包含两个成员,一个是指向 Foo 的指针 ptr,另一个是 ref_count 指针(其类型不一定是原始指针,有可能是 class 类型,但不影响这里的讨论),...图 1:shared_ptr 的数据结构。 为了简化并突出重点,后文画出 use_count 的值: ? 以上是 shared_ptr x(new Foo); 对应的内存数据结构。...x 开始赋值,其中2个成员 ,第一是原始指针 FOO1,第二个应用计数没来得及完成。 同时编程 B 执行 g = n; (即 write g),两个步骤一起完成了。 先是步骤 1: ?

10.1K31

CC++开发基础——智能指针

一,智能指针 1.智能指针简介 智能指针是用法和行为类似于指针的类对象。 智能指针的底层对原始指针做了一定的封装。...这三种智能指针实例的区别在于,管理原始指针的方式不一样。 shared_ptr允许多个指针指向同一个变量。 unique_ptr则独占所指向的变量。...常用的成员函数: get(): 返回指向变量的原始指针。...reset(): 重置智能指针,使它所持有的资源为空。 swap(): 交换两个智能指针所管理的资源。 release(): 返回指向变量的原始指针,并释放所有权。...4.shared_ptr智能指针 常用的成员函数: get(): 返回指向变量的原始指针reset(): 重置智能指针,使它所持有的资源为空。 swap(): 交换两个智能指针所管理的资源。

22920

shared_ptr 和 unique_ptr 深入探秘

继续深挖一下,这个问题会出现在 shared_ptr ?答案是不会。这又引入了另一个问题,shared_ptr 和 unique_ptr 的封装有什么不同?...shared_ptr 的封装按理说 shared_ptr.reset 的时候需要 delete ptr 就需要 ptr 的类型(错了请指正),而 shared_ptr 的 template type 可以是...Deleter 的类型在 control block 的具体类型上,shared_ptr 本身持有一个 control block 基类的指针,通过虚函数来调用 Deleter。...总结unique_ptr 保存了类型指针 ptr 和这个指针的析构方法,调用 delete ptr,就需要ptr的完整类型,为了防止这个问题出现,直接通过 assert sizeof 排除掉了这种风险...shared_ptr 保存的是一个控制块的指针。控制块包含的就是一个引用计数和一个原来对象的裸指针。控制块中初始化的指针是 nullptr,在运行时为其赋值,也可以通过 reset 修改。

23310

C++核心准则R.2: 在接口中表示单独对象使用原始指针

R.2: In interfaces, use raw pointers to denote individual objects (only) R.2: 在接口中表示单独对象使用原始指针 Reason...C风格字符串作为指向以0结尾的字符序列的指针传递。使用zstring而不是char*以表明你遵守这个习惯。...很多目前指向单独要素的指针可以使用引用。然而,当nullptr也是有效值时引用就不是一个合理的选择。...如果一个指针不是来自容器,view或者迭代器并存在指针运算(包括++),进行提示。这条准则如果运用于旧代码会产生大量的假阳性结果(结果有问题但实际上没有问题,译者注)。...Flag array names passed as simple pointers 提示用原始指针传递数组的情况。

42610

智能指针引用计数为0后,发生了什么?

shared_ptr shared_ptr 类型是 C++ 标准库中的一个智能指针,是为多个所有者可能必须管理对象在内存中的生命周期的方案设计的。...对象 DataPtr dataPtr2 = std::make_shared(2);//构造一个 shared_ptr对象 dataPtr1.reset(...引用计数为0之后我不想智能指针来帮我释放内存,我想自己释放内存可以?智能指针结合匿名函数综合应用。...(); //Data(1)的引用计数为1 //dataPtr2.reset();//Data(1)的引用计数为0,Data(1) 不要用一个原始指针初始化多个shared_ptr,原因在于,会造成二次销毁...智能指针相关的函数 成员函数 作用 reset() 重置智能指针,delete其关联的指针。 release() 不delete关联指针,并返回关联指针。 释放关联指针的所有权,智能指针为空。

1.9K30

智能指针详解

智能指针的使用 下面是一个原始指针和智能指针比较的示例代码 // 原始指针 void rawptr(){ // 使用原始指针 Obj *rawptr = new Obj("raw pointer...智能指针封装了指向堆分配对象的原始指针,因此智能指针通常提供直接访问其原始指针的方法。 C++ 标准库智能指针拥有一个用于此目的的get成员函数。...下面两条语句等价 unique_ptr a2(a1.release()); a2 = move(a1); // reset释放并销毁原生指针。...如果参数为一个新指针,将管理这个新指针 a2.reset(new Obj()); // 没有参数,以下两条语句等价 a2.reset(); //释放并销毁原有对象 a2 = nullptr; 参考官方文档....reset(); 参考官方文档:如何:创建和使用 weak_ptr 实例 智能指针使用实践 writing 参考文章:C++ 智能指针最佳实践&源码分析

20040

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

,有时可以检测出这种问题 同一块内存释放两次:当有两个指针指向相同的动态分配对象时可能发生这种错误,第一次delete时对象的内存就被归还给自由空间了,第二次delete可能破坏自由空间 坚持使用智能指针...p.reset(q); p.reset(q,d):若p是唯一指向其对象的shared_ptrreset会释放此对象。...我们不能将一个指针赋予shared_ptr,但是我们可以通过reset将一个新的指针赋予shared_ptr: p = new int(1024); // 错误:不能将一个指针赋予shared_ptr...p.reset(new int(1024)); // 正确:p指向一个新对象 reset和unique经常一起使用,来控制多个shared_ptr共享的对象。...为了正确使用智能指针,我们需要遵守一些规范: 不使用相同的内置指针值初始化或reset多个智能指针 不delete get()返回的指针 不使用get()初始化或reset另一个智能指针 如果你使用get

1.3K10

C++的智能指针unique_ptr、shared_ptr和weak_ptr

指针语义:unique_ptr的使用方式与原始指针相似,可以通过指针操作符(->)和解引用操作符(*)来访问所指向对象的成员。...get:返回指向所管理对象的裸指针reset:重置 unique_ptr,释放当前所管理的对象并接管新的对象。 release:释放对所管理对象的控制权,并返回该指针的裸指针。...指针语义:shared_ptr的使用方式与原始指针相似,可以通过指针操作符(->)和解引用操作符(*)来访问所指向对象的成员。 可拷贝:shared_ptr是可拷贝的,即可以进行复制构造和赋值操作。...reset:重置 shared_ptr,释放当前所管理的对象并接管新的对象。 release:释放对所管理对象的控制权,并返回该指针的裸指针。 swap:交换两个 shared_ptr 的内容。...如果原始shared_ptr 已经被释放,lock() 返回一个空的 shared_ptr

41920

STL四种智能指针

image.png unique_ptr与原始指针一样有效,并可用于 STL 容器。...unique_ptr指针与其所指对象的关系:在智能指针生命周期内,可以改变智能指针所指对象,如创建智能指针时通过构造函数指定、通过reset方法重新指定、通过release方法释放所有权、通过移动语义转移所有权...” u_s2.reset(u_s.release());//所有权转移 u_s2=nullptr;//显式销毁所指对象,同时智能指针变为空指针。...(5)对智能指针的改进 目前这个智能指针智能用于管理Point类的基础对象,如果此时定义了个矩阵的基础对象类,那不是还得重新写一个属于矩阵类的智能指针?...但是矩阵类的智能指针类设计思想和Point类一样啊,就不能借用?答案当然是能,那就是使用模板技术。为了使我们的智能指针适用于更多的基础对象类,我们有必要把智能指针类通过模板来实现。

2.7K41

【C++】简单实现C++11的三种智能指针

绪 本篇是尝试对C++11的三种智能指针(unique_ptr, shared_ptr, weak_ptr)进行的复现结果, 智能指针的复现在面试中经常考到, 需要好好熟悉...., 计数为0时自动delete. std::make_shared用来消除显式使用的new操作, .get()用来取得原始指针, .reset()用来消掉一个当前的引用计数, .use_count()得到目标对象的引用计数..., 注意防止自我赋值 void reset(pointer p = nullptr) noexcept { swap(UniquePtr(p)); } }; 智能指针基类 由于shared_ptr...的简单实现 shared_ptr需要一个间接层处理引用计数的问题, 因此带来了额外的开销, unique_ptr则完全没有额外的空间开销 对于性能不敏感的情况, 最好不要使用原始指针 建议不要对某个对象进行两次以上的...= nullptr; } }; weak_ptr的简单实现 weak_ptr的实现与shared_ptr类似, 只是修改的是weak计数 不允许直接从原始指针构造, 必须绑定在shared_ptr

1.4K20

详解 C++ 11 中的智能指针

然而,我之所以还向你介绍一下 std::auto_ptr 的用法以及它的设计不足之处是想让你了解 C++ 语言中智能指针的发展过程,一项技术如果我们了解它过去的样子和发展的轨迹,我们就能更好地掌握它,不是...也就是说,std_unique_ptr 的大小总是和原始指针大小一样,std::shared_ptr 和 std::weak_ptr 大小是原始指针的一倍。...spSubscriber 去管理之,可以却私下利用原始指针销毁了该对象,这让智能指针对象 spSubscriber 情何以堪啊?...记住,一旦智能指针对象接管了你的资源,所有对资源的操作都应该通过智能指针对象进行,不建议再通过原始指针进行操作了。...当然,除了 std::weak_ptr,std::unique_ptr 和 std::shared_ptr 都提供了获取原始指针的方法——get() 函数。

2.7K31

Chapter 4: Smart Pointers

delete 来释放原始指针所指向的资源。...就会对 a 指向对象的引用计数减 1 ,对 b 指向对象的引用计数加 1 ) 引用计数的存在有一些性能影响 std::shared_ptr 的大小是原始指针大小的两倍 引用计数的内存必须是动态分配的...::auto_ptr )来构造一个 std::shared_ptr 时,需要创建一个控制块 用一个原始指针来构造一个 std::shared_ptr 时,需要创建一个控制块 以上规则暗示了:如果使用一个原始指针分别构造了多个...std::shared_ptr - 如果要使用原始指针来构造 std::shared_ptr ,那么最好在 new 之后就将指针传给 std::shared_ptr 的构造函数,然后使用现有的...,如果 B 也想持有对 A 的指针,那么有三种选择 原始指针:如果 A 被销毁了,而 C 通过 B 来访问 A 就会出现解引用悬空指针 std::shared_ptr: 导致 A 和 C 的循环引用,

1.6K20

C++智能指针

大多数C++类用三种方法之一来管理指针成员: (1)不管指针成员。复制时复制指针,不复制指针指向的对象实体。当其中一个指针把其指向的对象的空间释放后,其它指针都成了悬挂指针。...目前这个智能指针智能用于管理Point类的基础对象,如果此时定义了个矩阵的基础对象类,那不是还得重新写一个属于矩阵类的智能指针?但是矩阵类的智能指针类设计思想和Point类一样啊,就不能借用?...为了使我们的智能指针适用于更多的基础对象类,我们有必要把智能指针类通过模板来实现。...image.png unique_ptr与原始指针一样有效,并可用于 STL 容器。...w=p; //p可以是shared_ptr或weak_ptr,赋值后w与p共享对象。 w.reset(); //将w置空。

3.4K30

C++智能指针详解(共享指针,唯一指针,自动指针

创建方式: shared_ptr pPoint{new string("pointer")}; shared_ptr pPoint; pPoint.reset(new string...= nullptr) //如果uq不为空 //check unique_ptr中的原始指针是否为空 if (uq.get() != nullptr) //如果uq不为空 4....swap(sp1, sp2) 交换sp1和sp2的指针和删除器 sp.reset() 放弃所有权并将共享指针重新初始化为空 sp.reset(ptr) 放弃所有权并使用默认删除器(称为delete)重新初始化共享指针...,拥有*ptr sp.reset(ptr, del) 放弃所有权并使用del作为删除器重新初始化共享指针,拥有* ptr sp.reset(ptr, del, ac) 放弃所有权并重新初始化共享指针,拥有...>语义 const_pointer_cast(sp) sp的const_cast语义 get_deleter(sp) 返回删除器的地址(如果有),否则返回nullptr strm << sp 调用原始指针的输出运算符

1.5K20

智能指针(一)

一般情况下有三种内存,静态内存用于保存局部static对象、类static数据成员以及函数外被定义的变量,这种对象或者变量在使用之前被分配,程序结束时销毁;栈内存用于保存在函数内的非static对象,栈对象在程序块运行时存在...swap(p,q) p.reset() //当p为唯一shared_ptr,将释放此对象; p.reset(q) //当p为唯一shared_ptr,将释放此对象;当q为内置指针时,会将p...指向q p.reset(q,d) //当p为唯一shared_ptr,将释放此对象;当q为内置指针时,d为函数,会将p指向q,调用函数d来释放 其中比较有意思的是赋值操作,它会将后者指向的对象的引用计数递增...1 p.reset()操作 当有多个shared_ptr共享同一个对象时,就可以用reset来获得新的拷贝,并且和原来的对象区分开来,如下所示: auto p = make_shared(100...//释放p所指向的对象 p.reset(q) //释放p所指向的对象,如果q为内置指针,则让p指向该对象 p.reset(nullptr) //释放p所指向的对象,将p置空 由于不能进行拷贝和赋值

82510
领券