class unique_ptr;可以看到,Deleter 的类型是 unique_ptr 类型的一部分。...回到 unique_ptr,现在我们知道 unique_ptr 的报错链路是 unique_ptr->delete->sizoef,也就是 sizeof 才是罪魁祸首。...继续深挖一下,这个问题会出现在 shared_ptr 吗?答案是不会。这又引入了另一个问题,shared_ptr 和 unique_ptr 的封装有什么不同?...shared_ptr 的封装按理说 shared_ptr.reset 的时候需要 delete ptr 就需要 ptr 的类型(错了请指正),而 shared_ptr 的 template type 可以是...总结unique_ptr 只保存了类型指针 ptr 和这个指针的析构方法,调用 delete ptr,就需要ptr的完整类型,为了防止这个问题出现,直接通过 assert sizeof 排除掉了这种风险
C++11引入了三种主要的智能指针:unique_ptr、shared_ptr和weak_ptr。...通过移动构造函数将所有权转移给另一个unique_ptr std::unique_ptr ptr2 = std::move(ptr); // 注意,此时ptr已经为空指针,...// 使用lock()函数获取一个shared_ptr std::shared_ptr ptr3 = weakPtr.lock(); if (ptr3 !...weak_ptr 具有以下特点和用法: 弱引用:因为 weak_ptr 不会增加引用计数,所以当所有 shared_ptr 都释放后,weak_ptr 将自动失效。...通过 shared_ptr 创建:通常,我们使用 shared_ptr 来初始化 weak_ptr。这样可以确保 weak_ptr 观察的对象仍然存在。
阶段 特点 问题 优化 早期 大量使用 shared_ptr 捕获 this 循环引用、内存泄漏 改成 weak_ptr 中期 shared_ptr 在百万 IOPS 下性能瓶颈 5~15% CPU...回调 librados 客户端 API 仍暴露 shared_ptr 兼容性考虑 对外 shared_ptr,内部 intrusive_ptr 2.1 问题背景 Ceph 没有完全放弃 shared_ptr...和intrusive_ptr_release函数接口供boost::intrusive_ptr调用。...intrusive_ptr_base { } 特性 intrusive_ptr std::shared_ptr 内存开销 一次分配。...boost 库支持智能指针,包括 scoped_ptr、shared_ptr 以及 auto_ptr。
shared_ptr template class shared_ptr; (C++11 起) 多个shared_ptr管理同一个指针,仅当最后一个shared_ptr析构时,指针才被...引用计数指的是,所有管理同一个裸指针(raw pointer)的shared_ptr,都共享一个引用计数器,每当一个shared_ptr被赋值(或拷贝构造)给其它shared_ptr时,这个共享的引用计数器就加...T> class Shared_Ptr{ public: Shared_Ptr(T* ptr = nullptr) :_pPtr(ptr) , _pRefCount(new int(1))...多个无关的shared_ptr管理同一裸指针 只能通过复制构造或复制赋值其值给另一 shared_ptr ,将对象所有权与另一 shared_ptr 共享。...(shared_ptr p1, shared_ptr p2); // 使用 f(shared_ptr(new A), shared_ptr(new B));
在 C++ 中,std::shared_ptr 和 std::unique_ptr 是两种不同的智能指针,它们有不同的所有权语义,不能直接互换,但在特定条件下可以相互转换: 1. unique_ptr...→ shared_ptr (✅ 安全) // unique_ptr 可以转换为 shared_ptr(移动语义) std::unique_ptr unique = std::make_unique...(unique == nullptr); 2. shared_ptr → unique_ptr (❌ 不安全) std::shared_ptr shared = std::make_shared...(std::unique_ptr&& unique) { return std::shared_ptr(std::move(unique)); } // shared_ptr →...shared_ptr → unique_ptr:❌ 不安全,应避免 设计时应明确所有权策略,避免混用 当需要共享所有权时,直接从源头使用 shared_ptr
智能指针的引入极大地简化了资源管理,尤其在 C++11 以后,unique_ptr、shared_ptr 和 weak_ptr 被标准化并广泛应用于现代 C++ 项目中。...二、智能指针概览 智能指针类型 所有权 引用计数 可拷贝性 自动释放 unique_ptr 唯一 否 否 是 shared_ptr 共享 是 是 是 weak_ptr 非拥有 是 是 否 三、unique_ptr...::cout ptr << std::endl; 3.2 转移所有权 cpp复制编辑std::unique_ptr ptr2 = std::move(ptr); 图示(逻辑结构):...scss复制编辑ptr ───► [10] (转移后) ptr (null) ptr2 ───► [10] 3.3 自定义析构函数 cpp复制编辑structFileCloser {...} }; 九、性能比较与推荐使用场景 使用场景 推荐智能指针 独占资源、无共享 unique_ptr 多个对象共享所有权 shared_ptr 弱引用、观察者模式 weak_ptr 原始指针无所有权需求
哪怕进入公司 讨论 方案设计,bug 定位解决,没有 人关系 c++新特性, 所以,我能做的就是把能做的事情做好: • 一个笔记本,建立项目工程,写一个 cpp 文件,std 标准库,写 demo,git...static Ptr get() //返回不继续拷贝 { return Ptr(new (tls().get().release()) T); } //返回unique_ptr 这个不是复制 =.../unique_ptr.html unique_ptr( unique_ptr&& u ) noexcept explicit unique_ptr( pointer p ) noexcept;...template class unique_ptr { T* ptr_; // 底层原始指针 public: // 移动构造函数 unique_ptr...(unique_ptr&& other) noexcept : ptr_(other.ptr_) { // 1.
然后将类实例的成员变量share指针也指向这个类实例 #include #include class Node { public: std::shared_ptr...p; }; int main() { std::shared_ptrnode(new Node()); node->p=node; std::cout<...指针解决循环引用问题,weak只引用资源不增加资源引用的计数 #include #include class Node { public: std::weak_ptr...p; }; int main() { std::shared_ptrnode(new Node()); node->p=node; std::cout<
shared_ptr 头文件 template class SharedPointer { public: SharedPointer(T *ptr = nullptr, const...std::function &del = Deleter()): p(ptr), use_c(new std::size_t(ptr !...del = Deleter()): p(ptr), use_c(new std::size_t(ptr !...头文件 template > class UniquePointer { public: UniquePointer...的头文件,拷贝构造函数和=操作符重载函数是delete.这也就说明unique_ptr中不能进行直接拷贝和赋值操作。
{} ~unique_ptr() { if(ptr) deleter(ptr); } // 不可拷贝 unique_ptr(const unique_ptr&) = delete...; unique_ptr& operator=(const unique_ptr&) = delete; // 可移动 unique_ptr(unique_ptr&& u) noexcept...: ptr(u.ptr) { u.ptr = nullptr; } unique_ptr& operator=(unique_ptr&& u) noexcept { if(this...(ptr); ptr = p; } }; 2....unique_ptr,必须共享就用 shared_ptr,控制引用计数就是控制你的性能。”
资源(堆内存、文件句柄、套接字等)应由对象“拥有”。 该对象在其构造函数中创建或接收新分配的资源,并在其析构函数中将此资源删除。...unique_ptr,只可以被移动给另一个unique_ptr。...所以 weak_ptr 的作用就来了: 【伪代码】 class node{ weak_ptr start; weak_ptr end; } shared_ptr...所以,weak_ptr 的作用就是作为一个 "观察者" 访问 shared_ptr 本身,而不是 shared_ptr 所托管的资源。...同时也意味着,weak_ptr 只能访问它所观察的 shared_ptr 本身,而不能访问 share_ptr 托管的资源,所以,它不会增加 shared_ptr 的引用计数。
今天了解了PTR解析记录才明白是怎么一回事。 ---- 平常解析域名用的最多的应该就是A(AAAA)/CNAME类型了,其他的很少用到,也很少了解到。今天就说一下 我对PTR记录的理解。...百度百科中写到: PTR (Pointer Record),指针记录,是电子邮件系统中的一种数据类型,被互联网标准文件RFC1035所定义。与其相对应的是A记录、地址记录。二者组成邮件交换记录。...所以可以粗糙的理解为, PTR是A记录的反向,可以通过IP地址查到对应的域名记录。而拥有这个权限的是ISP(互联网服务提供商),只有向ISP申请才能实现PTR解析。...在php中,可以使用 gethostbyaddr 函数来进行查询; 在Linux下,可以通过 host 1.1.1.1 直接查询,或者 host -t PTR 1.1.1.1 来查询; 也可以通过 nslookup
Assemble指令中标识大小 在Assemble中通常会看到WORD ptr或者DWORD ptr或者BYTE ptr等关键字,这些关键字主要用来标识指令操作数的大小(或者说长度) WORD ptr...:标识该操作数为1个字 DWORD ptr:标识该操作数为2个字 BYTE ptr:标识该操作数为1个字节 基础知识 1 BYTE = 8 bits 1 WORD = 2 BYTE 1 DWORD...= 2 WORD 举例 and dword ptr [ebp-4], 0 ebp为栈指针的基址指针,总是指向当前方法栈的最底部,当函数返回后,该寄存器中的指针才会返回。...由于只是指出了目的操作数的内存基址,但是没有指出寄存器到底要操作一个BYTE,还是一个WORD,还是DWORD,所以需要加上dword ptr来表示进行与操作的时候,读取从ss:ebp-4的位置到ss:...参考资料 What does "dword ptr" mean? In assembly, what does "PTR" stand for?
T> class scoped_ptr : noncopyable { private: T *px; scoped_ptr(scoped_ptr...const &); scoped_ptr & operator=(scoped_ptr const &); typedef scoped_ptr this_type...=( scoped_ptr const & ) const; public: explicit scoped_ptr(T *p = 0); ~scoped_ptr...此外,还可以使用 auto_ptr 对象 构造一个scoped_ptr 对象: scoped_ptr( std::auto_ptr p ): px( p.release() ); 由于scoped_ptr...typedef boost::shared_ptr parent_ptr; typedef boost::shared_ptr child_ptr; class Child
{ private: T *px; scoped_ptr(scoped_ptr const &); scoped_ptr &operator=...(scoped_ptr const &); typedef scoped_ptr this_type; void operator==( scoped_ptr ...=( scoped_ptr const & ) const; public: explicit scoped_ptr(T *p = 0); ~scoped_ptr...此外,还可以使用 auto_ptr 对象 构造一个scoped_ptr 对象: scoped_ptr( std::auto_ptr p ): px( p.release() ); 由于scoped_ptr...typedef boost::shared_ptr parent_ptr; typedef boost::shared_ptr child_ptr; class Child
std::shared_ptr 因其便利性、安全性而广受欢迎,但当我们追求极致性能时,目光往往会投向 boost::intrusive_ptr。...第一部分:性能的本质差异——缓存一致性与原子操作 许多开发者直觉上认为 std::shared_ptr 慢于 boost::intrusive_ptr 是因为前者涉及 原子操作(Atomic Operations...1. std::shared_ptr 的开销结构:分离式控制块 std::shared_ptr 的设计哲学是 非侵入式。这意味着它能够管理任何类型的对象 T,无需 T 本身具备引用计数的能力。...性能瓶颈分析: 当多个线程同时对同一个 shared_ptr 进行复制或销毁操作时(例如,通过不同的 shared_ptr 实例访问同一个对象),它们都需要修改 控制块 中的引用计数。...第二部分:intrusive_ptr 的巧妙机制——参数依赖查找(ADL) boost::intrusive_ptr 的实现方式是 C++ 模板编程中一个非常精妙的范例。
比如如果比较 shared_ptr 和 shared_ptr 的时候。...std::shared_ptr 和 boost::shared_ptr 的差异 在写单元测试的时候,我发现 std::shared_ptr 和 boost::shared_ptr 的实现上还有一些行为上的差异...这里 strong_rc_ptr 保持和 std::shared_ptr 的行为一致。...我也是觉得 std::shared_ptr 的行为更符合直觉,所以按 std::shared_ptr 的行为为准。 单元测试 单元测试我直接就扒了 boost.shared_ptr 的了。...compat_strong_ptr_function_trait::template shared_ptr; using weak_ptr = typename compat_strong_ptr_function_trait
p0 = std::unique_ptr(new int { 1 }); std::unique_ptr p1 = std::unique_ptrptr 要比 std::shared_ptr 更实用,因为 std::unique_ptr 对对象的所有权是明确的,销毁时机也是明确的,可以很好地避免使用 new... = 0> explicit unique_ptr(pointer _Ptr) noexcept : _Mypair(_Zero_then_variadic_args_t{}, _Ptr)...最后,有关构造和赋值比较重要的是被删除的两个方法: unique_ptr(const unique_ptr&) = delete; unique_ptr& operator=(const unique_ptr...unique_ptr std::unique_ptr 还有另外一个定义,即: template class unique_ptr<_
例如std::vector IntVec,使用shared_ptr方式为std::vectorptr > IntptrVec. 4、boost::shared_ptr...“ << *pA << endl; cout ptr_arr = “ ptr_arr << endl; // 操作对象 boost::shared_ptr ptr_obj; boost...::shared_ptr ptr_MyClass(new MyClass()); ptr_obj = ptr_MyClass; ptr_obj->func(); // 智能指针避免普通指针和智能指针混用...boost::shared_ptr ptr_obj001(new MyClass()); cout ptr_obj001.use_count() << endl; boost::shared_ptr...ptr_obj001.use_count() << endl; { // 新作用域指向同一对象,同样会自增引用计数 boost::shared_ptr ptr_obj003 = ptr_obj001;
我们无需关心销毁只管尽情的申请,系统提供了一个 auto_ptr 类可以使用这样的功能。后面我们也会用简单的代码示例介绍 auto_ptr 内部是如何实现的。...A(){cout << “A constructor” << endl;}; ~A(){cout << “A destructor” << endl;}; }; void foo() { auto_ptr...可以对构造出来的对象解引用 A& operator*() { return *_p; } private: A* _p; }; void foo() { // 构造一个SPA对象,传递一个A的指针 SPA ptr...(new A); // 调用重载的->运算符 ptr->display(); // 调用重载的*运算符 (*ptr).display(); // 出栈后让栈上的SPA对象析构 // 调用了析构函数,所以会自动销毁