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

如果我在整个类上使用std::swap,是否会使用专门的shared_ptr::swap()函数?

如果在整个类上使用std::swap,不会直接使用shared_ptr::swap()函数。std::swap是一个通用的模板函数,用于交换两个对象的值。当在整个类上使用std::swap时,会调用类中成员变量的swap函数,而不是直接调用shared_ptr::swap()函数。

对于shared_ptr类型的成员变量,std::swap会调用shared_ptr的swap成员函数,该函数会交换两个shared_ptr对象的指针和引用计数。这样可以确保在交换对象时,引用计数也会正确地更新。

然而,需要注意的是,如果类中的成员变量是裸指针类型而不是shared_ptr类型,那么std::swap将会调用裸指针的交换操作,而不会调用shared_ptr::swap()函数。这可能导致在交换对象时,引用计数无法正确更新,从而可能导致内存泄漏或者悬空指针的问题。

因此,在使用std::swap时,如果类中包含shared_ptr类型的成员变量,建议使用std::swap来交换对象,以确保引用计数的正确更新。如果类中包含裸指针类型的成员变量,建议使用自定义的swap函数来交换指针,并在其中手动更新引用计数。

腾讯云相关产品推荐:

  • 云服务器CVM:https://cloud.tencent.com/product/cvm
  • 云数据库MySQL版:https://cloud.tencent.com/product/cdb_mysql
  • 人工智能平台AI Lab:https://cloud.tencent.com/product/ailab
  • 云存储COS:https://cloud.tencent.com/product/cos
  • 区块链服务BCS:https://cloud.tencent.com/product/bcs
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

现代C++之手写智能指针

如果你觉得这个实现很别扭的话,也恭喜你,因为 C++ 委员也是这么觉得:auto_ptr C++17 时已经被正式从C++ 标准里删除了。 上面会导致什么问题呢?...类似,采用栈指针去管理堆上内容,从而使得堆上对象随着栈对象销毁时自动删除; 2)scoped_ptr有着更严格使用限制——不能拷贝,这也意味着scoped_ptr不能转换其所有权,所以它管理对象不能作为函数返回值...析构函数,生成规则和C++98一样,C++11中有点不同是,析构函数默认是noexcept。 拷贝构造函数,用户自定义了移动操作导致不生成默认拷贝构造函数,其它和C++98行为一致。...// 析构函数中,先判断该临时对象是否指向资源,如果没有,析构结束。否则,对引用计数减1,判断引用计数是否为0,如果为0,删除共享引用计数指针,否则不操作。...析构函数中,先判断该临时对象是否指向资源,如果没有,析构结束。否则,对引用计数减1,判断引用计数是否为0,如果为0,删除共享引用计数指针,否则不操作。

2.9K10

std::shared_ptr 线程安全性 & 多线程中使用注意事项

std::shared_ptr 是个模版,无法孤立存在,因此实际使用中,我们都是使用具体模版。...这里使用 std::shared_ptr 来举例,我们讨论时候,其实讨论 std::shared_ptr 线程安全性,并不是 SomeType 线程安全性。...那我们讨论某个操作是否线程安全时候,也需要看具体代码是作用在 std::shared_ptr ,还是 SomeType 。...() 函数是否线程安全,这里显示是非线程安全,因为对 some_value 操作没有加锁,也没有使用 atomic 类型,多线程访问就出现未定义行为(UB) std::shared_ptr 线程安全性...如果确实需要在多线程环境下对同一 std::shared_ptr 实例做 swap () 操作,可以调用 atomic 对 std::shared_ptr 重载函数,如: template< class

2.5K10
  • 从零开始学C++之boost库(一):详解 boost 库智能指针(scoped_ptr 、shared_ptr 、weak_ptr 源码分析)

    boost::scoped_ptr和std::auto_ptr功能和操作都非常类似,如何在他们之间选取取决于是否需要转移所管理对象所有权(如是否需要作为 函数返回值)。...如果C++基础比较好,可以想到拷贝构造函数跟构造函数一样,如果有对象成员是需要先构造对象成员(这一点 也可以从调用堆栈看出),故可以shared_count 拷贝构造函数设置断点,然后就可以跟踪进去...说到这里,我们也可以明白,即使最后没有调用p2.reset(); 当p2 栈对象生存期到, 需要调用shared_ptr 析构函数,进而调用shared_count 析 构函数,所以执行结果也是跟...强引用与弱引用: 强引用,只要有一个引用存在,对象就不能释放 弱引用,并不增加对象引用计数(实际是不增加use_count_, 增加weak_count_);但它能知道对象是否存在 通过weak_ptr...访问对象成员时候,要提升为shared_ptr 如果存在,提升为shared_ptr(强引用)成功 如果不存在,提升失败 对于上述例子,只需要将Parent 里面的成员定义改为如下,

    1.3K30

    C++智能指针原理和实现

    智能指针主要思想是RAII思想,“使用对象管理资源”,构造函数中获取资源,析构函数中释放资源。智能指针行为类似常规指针,重要区别是它负责自动释放所指向对象。   ...;   3.析构函数中完成资源清理,可以保证资源正确初始化和释放;   4.如果对象是用声明方式创建局部对象,那么RAII机制就会正常工作,当离开作用域对象自动销毁而调用析构函数释放资源。...对象所有权是独占性使用拷贝构造和赋值操作符时,造成对象所有权转移,被拷贝对象拷贝过程中被修改;   (3) 基于第二条,因此不能将auto_ptr放入到标准容器中或作为容器成员;   (4...交换: std::swap(std::shared_ptr) 特化swap算法用于交换两个智能指针。   ...交换:std::swap(std::weak_ptr) 特化swap算法用于交换两个智能指针。 注意事项:   (1) 不能将指针直接赋值给一个智能指针,一个是,一个是指针。

    54430

    从零开始学C++之boost库(一):详解 boost 库智能指针

    boost::scoped_ptr和std::auto_ptr功能和操作都非常类似,如何在他们之间选取取决于是否需要转移所管理对象所有权(如是否需要作为 函数返回值)。...本想跟踪shared_ptr 拷贝构造函数,在当行设置断点后F11直接跳过了,说明是shared_ptr没有实现拷贝构造函数使用是编译器默认拷 贝构造函数,那如何跟踪呢?...如果C++基础比较好,可以想到拷贝构造函数跟构造函数一样,如果有对象成员是需要先构造对象成员(这一点 也可以从调用堆栈看出),故可以shared_count 拷贝构造函数设置断点,然后就可以跟踪进去...说到这里,我们也可以明白,即使最后没有调用p2.reset(); 当p2 栈对象生存期到, 需要调用shared_ptr 析构函数,进而调用shared_count 析 构函数,所以执行结果也是跟...强引用与弱引用: 强引用,只要有一个引用存在,对象就不能释放 弱引用,并不增加对象引用计数(实际是不增加use_count_, 增加weak_count_);但它能知道对象是否存在 通过weak_ptr

    6.3K20

    从零开始学C++之boost库(一):详解 boost 库智能指针(scoped_ptr 、shared_ptr 、weak_ptr 源码分析)

    boost::scoped_ptr和std::auto_ptr功能和操作都非常类似,如何在他们之间选取取决于是否需要转移所管理对象所有权(如是否需要作为 函数返回值)。...本想跟踪shared_ptr 拷贝构造函数,在当行设置断点后F11直接跳过了,说明是shared_ptr没有实现拷贝构造函数使用是编译器默认拷 贝构造函数,那如何跟踪呢?...如果C++基础比较好,可以想到拷贝构造函数跟构造函数一样,如果有对象成员是需要先构造对象成员(这一点 也可以从调用堆栈看出),故可以shared_count 拷贝构造函数设置断点,然后就可以跟踪进去...说到这里,我们也可以明白,即使最后没有调用p2.reset(); 当p2 栈对象生存期到, 需要调用shared_ptr 析构函数,进而调用shared_count 析 构函数,所以执行结果也是跟...强引用与弱引用: 强引用,只要有一个引用存在,对象就不能释放 弱引用,并不增加对象引用计数(实际是不增加use_count_, 增加weak_count_);但它能知道对象是否存在 通过weak_ptr

    1.5K00

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

    std::weak_ptr为了解决循环引用问题而提出, 类似std::shared_ptr但是不会增加引用计数. std::weak_ptr没有*和->因此不能操作资源, .expired()可以检查目标资源是否被释放..., 若释放则返回true. .lock()资源未释放时候返回一个新std::shared_ptr, 否则返回nullptr 智能指针释放依赖于作用域, 所以当需要使用更大生命周期时还是应该考虑手动管理或者更大作用域中使用智能指针...但是垃圾回收器分析和执行仍然有很大代价 垃圾回收器有时候遇到缓存优化问题, 而且回收时间可能造成停顿, 智能指针在这点上表现更好, 可以实时处理 垃圾回收器一般单独线程中执行, 而智能指针回收在当前线程析构函数中执行...shared_ptr 这个问题是由于非侵入式访问标准库设计哲学, shared_ptr计数器和对象本身是分离, 如果中对this构造一个shared_ptr, 那么产生是第二个计数器, 和初始化两次...因此中这个构造函数结束后, 这个对象(自己)就会被调用析构, 然后一切都boom了 enable_shared_from_this则通过weak_ptr安全地生成了一个自己shared_ptr,

    1.7K20

    C++ 智能指针(unique_ptr, shared_ptr)源码分析

    博文https://blog.csdn.net/qq_27717921/article/details/82940519已经介绍了unique_ptr和shared_ptr使用,但是这两智能指针是如何做到管理指针呢...采用new返回指针初始化shared_ptr,调用构造函数堆上开辟一块存储空间,存放指向这块空间指针数量,这块空间地址初始化use_c. new int(2)返回指针用于初始化p. 2. shared_ptr...,当函数退出时,t调用析构函数时, 也就是最后一个对象调用析构函数时,如果t.p不是空指针时,会调用p指向内存类型删除器。...() { deleter(p); } 和shared_ptr析构函数不同,unique_ptr析构函数更简单, 只需要调用类型T析构函数如果是自定义类型需要重写deleter template...unique_ptrp置为nullptr,但是返回这块地址。

    2.6K32

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

    ,都需要在堆中申请一段内存,然后函数最后释放该内存。...但是当函数运行期间出现异常时候,delete将不被执行,此时申请到内存得不到释放,会发生内存泄露。智能指针由于是对象,该类对象可以析构时候自动释放智能指针所指向内存。...因此,如果此时使用智能指针代替原始指针,可以不用手动调用"delete/delete []",智能指针指向堆内存自动被释放。...智能指针常用模板有: std::unique_ptr std::shared_ptr std::weak_ptr 由上述模板可以生成三种类型智能指针实例。...如果必须要使用new/delete,可以考虑以下措施来避免: 1.尽可能使用栈内存 栈内存不会造成内存泄露,且资源一旦超出栈使用范围就会被销毁。

    30820

    【C++】基础:Effective C++高效编程建议

    使接口易于正确使用,而难以错误使用接口易于正确使用,而难以错误使用。你应该在你所有接口中为这个特性努力。 使易于正确使用方法包括接口和行为兼容性与内建类型保持一致。...当类型转换应该用于所有参数时,声明为非成员函数 如果你需要在一个函数所有参数(包括被 this 指针所指向那个)使用类型转换,这个函数必须是一个非成员函数。 25....考虑支持不抛异常 swap 如果 std::swap 对于你类型来说是低效,请提供一个 swap 成员函数。并确保你 swap 不会抛出异常。...如果你提供一个成员 swap,请同时提供一个调用成员 swap 非成员 swap。对于(非模板),还要特化 std::swap。...调用 swap 时,请为 std::swap 使用一个 using declaration,然后调用 swap 时不使用任何 namespace 限定条件。 26.

    12810

    【笔记】《Effective C++》条款1-25

    delete, 此时基没有虚析构函数, 那么此时这个对象实际上会调用基析构函数(因为没有多态), 于是整个内存回收是不完全, 导致一个局部销毁对象从而引发内存泄漏 最好解决方法就是对于任何一个将要用来继承都实现虚析构函数...weak_ptr: 不参与引用计数, 与shared_ptr一起使用 14 资源中小心Copying行为 这一条是当你不得不自己建立资源管理时候要注意 如果对RAII进行复制是不合理, 那么就应该禁止它...这个版本swap可以有复杂偏特化 再在std命名空间中提供一个只关于本身(不允许是模板)swap特化, 同样调用我们成员swap....不允许是模板是因为std设计协议就是不要为std添加任何额外模板, 函数, 等等, 我们只允许添加新模板特化版本 最后我们需要调用swap时候, 先using std::swap;暴露出std...swap, 这样编译器进行函数搜索时候优先查找当前命名空间swap, 找不到时会再去找stdswap

    1K30

    《Effective C++》读书笔记(4):设计与声明

    shared_ptr还有个性质是会使用每个指针专属删除器。...如果对象一个DLL中被new创建而在另一个DLL内被delete,会引起运行期错误;而shared_ptr使用删除器来自创建时所在DLL,不存在上述问题。...如果对于你/模板来说,swap默认实现效率可接受,那么无需额外做什么;而如果默认实现效率不足,通常源于为了二进制兼容性使用了pimpl技法,就需要实现一个确保不抛出异常swap:...2、/模板所在命名空间提供一个non-memberswap,调用swap成员函数。 3、对于(而非模板),还需特化std::swap,调用swap成员函数。...4、真正使用swap时先声明using std::swap,再直接使用swap,让编译器寻找最合适swap实现版本。

    18730

    C++智能指针

    即我们实际把管理一份资源责任托管给了一个对象 好处: 不需要显式地释放资源 对象所需资源在其生命期内始终保持有效 示例: // 使用RAII思想设计SmartPtr template...:只声明不实现+声明成私有;C++11防拷贝方式修饰函数为delete 5、std::shared_ptr 概念及介绍: C++11中开始提供更靠谱并且支持拷贝shared_ptr shared_ptr...在对象被销毁时(也就是析构函数调用),就说明自己不使用该资源了,对象引用计数减一 如果引用计数是0,就说明自己是最后一个使用该资源对象,必须释放该资源 如果不是0,就说明除了自己还有其他对象使用该份资源..._ptr); std::swap(_pCount, sp._pCount); std::swap(_mtx, sp...._ptr); std::swap(_pCount, sp._pCount); std::swap(_mtx, sp.

    60520

    《Effective C++》读书笔记(5):实现

    过早地声明某对象,如果因为种种原因(条件分支、过早返回、异常等)没有使用该对象,那么不仅降低了程序清晰度,还浪费了上述构造、析构成本。...= ptrs.end(); ++iter){ (*iter)->f(); } //或者将f()实现为虚函数,则也无需转型 如果转型是必要,试着将它隐藏于某函数背后;用户调用该函数而不是使用转型...---- 条款29、为“异常安全”而努力是值得 抛出异常时,异常安全函数不泄露任何资源、不允许数据败坏。函数“异常安全保证”等于所调用各个函数“异常安全保证”中最弱者。...; }; ---- 条款30、透彻了解inlining里里外外 将大多数inlining限制小型、被频繁调用函数身上。...提供一个抽象基,目的是描述派生接口,因此它不提供成员变量、构造函数,只提供虚析构函数与一组纯虚函数来描述所有接口。

    19020

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

    ①unique_ptr C++中,unique_ptr是一个智能指针(smart pointer)模板,用于管理动态分配内存资源,它提供了自动释放内存功能。...②shared_ptr C++中,shared_ptr是一个智能指针(smart pointer)模板,用于管理动态分配内存资源。...每次拷贝增加引用计数。当引用计数变为0时,表示没有任何shared_ptr指向该内存,释放内存。 循环引用问题:如果存在循环引用(两个或多个对象相互持有shared_ptr),导致内存泄漏。...通过弱引用指针,我们可以需要时使用lock()函数获取一个有效shared_ptr来操作对象,一旦对象引用计数变为0,弱引用指针将自动失效。...判断是否有效:可以使用 expired() 函数来检查 weak_ptr 是否已经失效,即所观察 shared_ptr 是否已经被释放。

    73720

    boost信号槽原理和实践

    这里觉得一些场景下,boost signal2也是不错选择。...然后,用于处理槽列表以及从槽标识符到连接映射所有代码都被分解到signal_base 专门处理any和 function对象中,使用众所周知 pimpl 惯用法隐藏实际实现。..."pull" 模式可以保存combiner's state和, 新数据来时候,过来一下数据。相反“push" 模式需要combiner保存各个状态,如果slots过多,会是不小开销。...原来Boost.Signals 使用boost::signals::trackable派生。 由于boost::signals::trackable派生析构函数顺序先于base析构函数。...多线程环境中,如果一个object一个线程被析构了,另一个线程signalcall到摧毁object。 signal2使用了shared_pt机制来解决这个问题。

    36710

    C++ 新特性学习(一) -- 概述+智能指针(smart_ptr)

    C++ 0x/11 终于通过了,真是个很爽消息。于是乎决定对新东西系统学习一下。 首先当然要从tr1开始,智能指针实际已经用过很多次了,但是为了完整起见,还是写出来记录一下。...如果表达式e是一个函数,那么就是这个函数返回值类型。 如果不符合1和2,如果e是左值,类型为T,那么decltype(e)是T&;如果是右值,则是T。...这段代码支持GNU-C++、VC++,如果电脑里C++版本不够则会导入BOOST里智能指针库,这时候要安装BOOST库,贴完这一段,就可以使用神奇std::shared_point了。...另外智能指针还有个重要东西叫std::weak_ptr,这是智能指针一个监视器,内部不会改变引用技术,但是可以用于获取智能指针,当资源正常时lock函数返回智能指针,当资源被释放了后会产生空指针...另外,使用智能指针必须注意两点: 避免引用成环 引用成环导致引用计数永不为0,造成内存泄漏,比如在a,b,c里,各有一个成员变量p,使得a.p = &b, b.p = &c, c.p = &a;

    33520

    C++ 新特性学习(一) -- 概述+智能指针(smart_ptr)

    C++ 0x/11 终于通过了,真是个很爽消息。于是乎决定对新东西系统学习一下。 首先当然要从tr1开始,智能指针实际已经用过很多次了,但是为了完整起见,还是写出来记录一下。...如果表达式e是一个函数,那么就是这个函数返回值类型。 如果不符合1和2,如果e是左值,类型为T,那么decltype(e)是T&;如果是右值,则是T。...这段代码支持GNU-C++、VC++,如果电脑里C++版本不够则会导入BOOST里智能指针库,这时候要安装BOOST库,贴完这一段,就可以使用神奇std::shared_point了。...另外智能指针还有个重要东西叫std::weak_ptr,这是智能指针一个监视器,内部不会改变引用技术,但是可以用于获取智能指针,当资源正常时lock函数返回智能指针,当资源被释放了后会产生空指针...另外,使用智能指针必须注意两点: 避免引用成环 > 引用成环导致引用计数永不为0,造成内存泄漏,比如在a,b,c里,各有一个成员变量p,使得a.p = &b, b.p = &c, c.p = &

    56310

    【Example】C++ Template (模板)概念讲解及编译避坑

    进行在模板函数调用时,编译器根据变量类型推断函数参数类型。 那么,函数模板是否可以支持多种类型呢?可以!...当你参数类型需要两种或以上时候,就是 template 当中增加声明,再对函数进行修饰: template 那么,除了基本数据类型,...2,模板 函数模板很好理解,那么模板是什么呢? 可以模板内部或外部定义成员函数如果模板外部定义成员函数,则会像定义函数模板一样定义它们。...--Microsoft Docs PS: 模板可以模板当中被定义并使用,这种情况下成为 “成员模板”,但是逻辑过于复杂,实际开发不建议使用,了解成员模板。...> 3,模板与完整泛型编程区别(编译避坑) C++ 模板没有被使用之前,编译器完全不知道它会占用多少空间!

    70920
    领券