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

带有deleter类的shared_ptr -为什么复制deleter?

带有deleter类的shared_ptr是C++中的智能指针,用于管理动态分配的资源。它允许多个shared_ptr对象共享同一个资源,并在最后一个对象不再需要资源时自动释放。

为什么复制deleter?

当我们使用shared_ptr复制一个指向资源的智能指针时,复制操作会增加资源的引用计数。这意味着资源仍然被多个shared_ptr对象共享,直到最后一个对象被销毁时才会释放资源。

复制deleter的目的是确保资源的释放行为在所有共享指针对象中保持一致。如果不复制deleter,那么每个复制的shared_ptr对象将拥有自己的独立deleter,这可能导致资源的释放行为不一致,甚至可能导致资源泄漏。

通过复制deleter,所有的shared_ptr对象都将共享同一个deleter对象,这样可以确保资源的释放行为一致。当最后一个shared_ptr对象被销毁时,deleter将被调用来释放资源。

总结: 带有deleter类的shared_ptr允许多个智能指针对象共享同一个资源,并在最后一个对象不再需要资源时自动释放。复制deleter的目的是确保资源的释放行为在所有共享指针对象中保持一致。

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

相关·内容

shared_ptr 和 unique_ptr 深入探秘

为什么 unique_ptr 需要明确知道类型析构函数这个问题是我写 unique_ptr 调试接口时候才注意到,之前确实不知道。为什么会这样呢?...假设内部是这么实现 (一般会运用空基优化把 Deleter 空间优化掉,libstdc++ 里把他们放进了一个 tuple。...默认构造时候允许是不完整类型。为什么会这样呢?shared_ptr 怎么处理 Deleter 呢?...(还记得吧, Deleter 就是智能指针析构时候删除操作)在常见编译器实现里,shared_ptr 把 Deleter(包括默认情况下 operator delete)放进一个叫做 control...Deleter 类型在 control block 具体类型上,shared_ptr 本身只持有一个 control block 基指针,通过虚函数来调用 Deleter

40410
  • 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..., rhs.deleter); } 函数swap操作,主要是交换shared_ptr成员变量,比如p.use_c = 0xff11ff12, p.p = 0x12fa2334, p.deleter=0xd232455f...2, 这个地方拷贝构造弯沉后已经完全相同了,为什么还有调用swap操作, 为了递减赋值号左侧对象use_c, 这个时候rhs存放就是赋值号左侧信息,在=结束后临时变量会调用析构函数, 从而减少左侧...release函数 ~UniquePointer() { deleter(p); } 和shared_ptr析构函数不同,unique_ptr析构函数更简单, 只需要调用类型T析构函数,如果是自定义类型需要重写

    2.7K32

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

    智能指针主要思想是RAII思想,“使用对象管理资源”,在构造函数中获取资源,在析构函数中释放资源。智能指针行为类似常规指针,重要区别是它负责自动释放所指向对象。   ...RAII是Resource Acquisition Is Initialization简称,即资源获取就是初始化:   1.定义一个来封装资源分配与释放;   2.构造函数中完成资源分配及初始化...,是一个轻量级智能指针,适合用来管理生命周期比较短或者不会被远距离传递动态对象,最好是局限于某个函数内部或者是某个内部。...  (3) 管理数组指针时,需要制定Deleter以使用delete[]操作符销毁内存,shared_ptr并没有针对数组特化版本;   (4) 不能把一个原生指针交给两个智能指针对象管理,对其它智能指针也是如此...m_pT; } 三、总结 智能指针就是模拟指针动作,一般智能指针都会重载 -> 和 * 操作符。

    54630

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

    ①unique_ptr 在C++中,unique_ptr是一个智能指针(smart pointer)模板,用于管理动态分配内存资源,它提供了自动释放内存功能。...不可拷贝:unique_ptr是不可拷贝,即不能进行复制构造和赋值操作。这是为了确保独占所有权特性,防止多个指针同时管理同一个对象内存。...②shared_ptr 在C++中,shared_ptr是一个智能指针(smart pointer)模板,用于管理动态分配内存资源。...指针语义:shared_ptr使用方式与原始指针相似,可以通过指针操作符(->)和解引用操作符(*)来访问所指向对象成员。 可拷贝:shared_ptr是可拷贝,即可以进行复制构造和赋值操作。.../ 复制构造函数,共享同一块内存 std::shared_ptr ptr2 = ptr1; // 增加引用计数 std::cout << ptr1.use_count

    78020

    为什么说智能指针是解决问题“神器”?

    一、为什么需要使用智能指针 (一)内存泄漏 C++在堆上申请内存后,需要手动对内存进行释放。代码初创者可能会注意内存释放,但随着代码协作者加入,或者随着代码日趋复杂,很难保证内存都被正确释放。...但由于unique_ptr不能进行复制,因此部分场景下不能使用。 unique_ptr使用场景 unique_ptr一般在不需要多个指向同一个对象指针时使用。...:forward(__u.get_deleter())) { } // 移动赋值函数,取出原有unique_ptr指针和析构器进行构造 unique_ptr& operator...会将shared_ptr成员变量地址进行复制。...浅谈Golang两种线程安全map 公司电脑为什么卡——因为缺少工程师文化!

    97320

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

    一、为什么需要使用智能指针 1.1 内存泄漏 C++在堆上申请内存后,需要手动对内存进行释放。代码初创者可能会注意内存释放,但随着代码协作者加入,或者随着代码日趋复杂,很难保证内存都被正确释放。...但由于unique_ptr不能进行复制,因此部分场景下不能使用。 3.1.1 unique_ptr 使用场景 unique_ptr一般在不需要多个指向同一个对象指针时使用。..., _VSTD::forward(__u.get_deleter())) {   }   // 移动赋值函数,取出原有unique_ptr指针和析构器进行构造   unique_ptr..._shared_weak_owners_(__refs) {} protected:     virtual ~__shared_weak_count(); public:     // 调用通过父...会将shared_ptr成员变量地址进行复制

    1.8K32

    C++ 共享指针四宗罪

    按是否要求资源对象自己维护引用计数,C++引用计数方案可以分为两: 侵入式:侵入式引用计数管理要求资源对象本身维护引用计数,同时提供增减引用计数管理接口。...,可以自定义一个什么也不做deleter: struct noop_deleter { void operator()(void*) { // NO-OP...(话说回来,这倒并不是说noop_deleter这种手法毫无用处,Boost.Asio中就巧妙地利用shared_ptr、weak_ptr和noop_deleter来实现异步I/O事件取消)。...通常,使用shared_ptr资源对象必须动态分配,最常见就是直接从堆上new出一个实例并交付给一个shared_ptr,或者也可以从某个资源池中分配再借助自定义deleter在引用计数归零时将资源放回池中...为了解决这个问题,Boost提供了一个模板enable_shared_from_this: 所有需要在成员方法中获取指向thisshared_ptr类型,都必须以CRTP手法继承自enable_shared_from_this

    52550

    字节一面,轻松通过!

    纯虚函数和抽象 纯虚函数: 一个中可以包含纯虚函数,通过在函数声明末尾添加 = 0 来声明纯虚函数。含有纯虚函数是抽象,无法实例化,只能用作基。...派生必须实现(覆盖)抽象纯虚函数,否则它们也会成为抽象。 4. 有了解C++shared_ptr 吗?...当最后一个指针被销毁时,它会自动释放所管理对象。 自定义删除器(Deleter): 可以提供一个自定义删除器函数(deleter function)来处理特定资源释放操作。...auto deleter = [](int* p) { // 自定义释放资源操作 delete p; }; std::shared_ptr customPtr(new int...(20), deleter); 使用注意事项 避免循环引用:std::shared_ptr 可能会出现循环引用导致资源无法释放问题。

    16810

    C++核心准则​讨论:持有没有被句柄管理资源时切勿抛出异常

    use an explicit pointer, rather than a resource handle with specific semantics, use a unique_ptr or a shared_ptr...with a custom deleter: 如果i == 0,则文件句柄发生泄漏。...另一方面,另一个文件ifstream将正确关闭其文件(销毁时)。...如果必须使用显式指针,而不是具有特定语义资源句柄,请使用带有自定义删除器unique_ptr或shared_ptr: void f(int i) { unique_ptr<FILE, int...检查器必须将所有“暴露指针”视为可疑。检查器可能必须依靠人工提供资源列表。首先,我们了解标准库容器,字符串和智能指针。使用span和string_view应该会很有帮助(它们不是资源句柄)。

    66810

    shared_ptr是线程安全吗?

    预期结果: *global_instance is 200000000 画外音: 执行结果 不是预期结果,肯定不是线程安全为什么还说内置安全。...为什么多线程读写 shared_ptr 要加锁? 以下内容,摘自陈硕 http://blog.csdn.net/solstice/article/details/8547547 ?...ref_count 对象有多个成员,具体数据结构如图 1 所示,其中 deleter 和 allocator 是可选。 ? 图 1:shared_ptr 数据结构。...如果再执行 shared_ptr y = x; 那么对应数据结构如下。 ? ---- 但是 y=x 涉及两个成员复制,这两步拷贝不会同时(原子)发生。...为什么用一个来管理另外一个指针呢 提示: 聚合关系图: ? 组合关系图: ? 2. 共享指针缺点 提示: ? ?

    10.6K31

    MSVC std::unique_ptr 源码解析

    在实际编程实践中,std::unique_ptr 要比 std::shared_ptr 更实用,因为 std::unique_ptr 对对象所有权是明确,销毁时机也是明确,可以很好地避免使用 new...is_final_v 时,会走上面的定义,使用 Empty base optimization 即空基优化,不满足时,则走下面的特化,退化成普通 pair,我们来通过一段示例代码看一下压缩效果...,由于 c++ 机制,会为其保留 1 字节空间,A 和 int 联合存放在 std::pair 里时,因为需要进行对齐,就变成了 4 + 4 字节,而 _Compressed_pair 则通过空基优化避免了这个问题...为元素类型,deleter_type 为删除器类型,我们主要关注 pointer,pointer 类型由 _Get_deleter_pointer_type 决定,我们可以发现它有两个定义,前者是默认定义...&) = delete; 这直接决定了 std::unique_ptr 没办法复制与相互赋值,这是语义上独享内存所有权基石。

    1.6K10

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

    前言:智能指针在C++11中引入,分为三shared_ptr:共享指针 unique_ptr:唯一指针 auto_ptr:自动指针 一、共享指针 几个共享指针可以指向同一个对象; 每当shared_ptr...弱指针是共享指针辅助,其允许共享但不拥有对象,因此不会增加关联对象引用次数 不能使用运算符*和->直接访问弱指针引用对象,而是使用lock函数生成关联对象共享指针(可能为空) 当拥有该对象最后一个共享指针失去其所有权时...~shared_ptr() 析构函数;如果sp拥有对象,则调用deleter sp = sp2 赋值(sp之后与sp2共享所有权,放弃先前拥有的对象所有权) sp = move(sp2) 移动赋值(sp2...(sp) spdynamic_cast语义 const_pointer_cast(sp) spconst_cast语义 get_deleter(sp) 返回删除器地址(如果有),否则返回nullptr...则为未定义行为) up[idx] 仅数组对象;返回具有存储数组索引idx元素(如果没有,则为未定义行为) up.get_deleter() 返回删除器引用

    1.6K20

    UE4智能指针 TSharedPtr

    先分享一下UE4共享指针内部结构图,也就是标题配图,点击可以放大,可以作为看源码参考图 TSharedPtr 这个对应std::shared_ptr,但是实现上要稍微简单一些,因为本身没有STL...按照像表达意义简单翻译一下,就是说这个智能指针是抄shared_ptr或boost智能指针,好处是让语法干净 ,明确对象所有者,防止内存泄露。但为什么不直接用STL又要仿照着造轮子呢?...),就可以将这个通过TSharedPtr传给外部其他业务到处用,就不用担心这个RT是不是会泄露了,等所有业务都不用时候,就会自动调用到Deleter来释放RT。...再搭配上前面说Deleter,对象池就可以管理任意资源了。...为什么要特意搞一个这样呢?可以想象一下,如果一个对象被外部某个TSharedPtr管理,在自己成员函数内,怎样获取外部这个智能指针呢?

    2.4K20

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

    , 因此智能指针可能导致当前线程的卡顿 unique_ptr简单实现 unique_ptr只能移动不能复制, 因此是唯一所有权....所有不需要分享指针都应该用这个来代替 unique_ptr还有一个默认模板参数是deleter决定析构时动作....由于shared_ptr和weak_ptr都有一个堆储存计数器来维护计数进行内存回收, 为了编写方便将其写为一个基来继承 由于shared_ptr和weak_ptr计数器是共享, 有可能被多线程竞争修改...shared, 我们脑子处理不了太多共享, 用weak代替 stl中通过让自己继承enable_shared_from_this, 我们可以生成指向自身thisshared_ptr 这个问题是由于非侵入式访问标准库设计哲学..., shared_ptr计数器和对象本身是分离, 如果在中对this构造一个shared_ptr, 那么产生是第二个计数器, 和初始化两次shared_ptr效果是一样, 并不是拷贝.

    1.7K20
    领券