std::weak_ptr可以作为std::shared_ptr的构造函数参数,但如果std::weak_ptr指向的对象已经被释放,那么std::shared_ptr的构造函数会抛出std::bad_weak_ptr异常。 std::shared_ptr<int>sp1(newint(22));std::weak_ptr<int> wp = sp1;// point to sp1std::shared_ptr<int>sp2(wp);std::cout<<sp2.us...
本文介绍了std::weak_ptr的底层原理、使用方法及其在缓存、避免循环引用、单例模式和enable_shared_from_this模板类中的应用。std::weak_ptr作为智能指针,提供使用权而不拥有权,辅助std::shared_ptr管理对象,确保对象生命周期管理得当。
通常用于解决循环引用问题。 2.weak底层原理 2.1weak 的实现原理可以概括一下三步: 1、初始化时:runtime会调用objc_initWeak函数,初始化一个新的weak指针指向对象的地址。 2、添加引用时:objc_initWeak函数会调用 objc_storeWeak() 函数, objc_storeWeak() 的作用是更新指针指向,创建对应的弱引用表。 3、释...
uintptr_t max_hash_displacement;// 可能会发生的hash冲突的最大次数,用于判断是否出现了逻辑错误(hash表中的冲突次数绝不会超过改值)};struct{// out_of_line_ness field is low bits of inline_referrers[1]weak_referrer_t inline_referrers[WEAK_INLINE_COUNT];};};boolout_of_line(){return(out_of_...
2.weak的实现原理 第一、通过weak编译解析,可以看出来weak通过runtime初始化的并维护的; 第二、weak和strong都是Object-C的修饰词,而strong是通过runtime维护的一个自动计数表结构。 综上:weak是有Runtime维护的weak表。 在runtime源码中,可以找到’objc-weak.h’和‘objc-weak.mm’文件,并且在objc-weak.h...
weak_ptr的产生,主要是为了配合shared_ptr的使用,对于shared_ptr来说,有一种循环引用会导致shared_ptr的引用计数一直不能变为0,如此以来导致内存一直不能释放的掉。例子可以参考下面例子: 代码语言:javascript 复制 #include<iostream>#include<memory>#include<vector>using namespace std;classClassB;classClassA{pub...
iOS底层原理:weak的实现原理 作者丨夜幕降临耶 链接: https://juejin.im/post/5e7a322f6fb9a07ca24f79bb 来源:掘金 在iOS开发过程中,会经常使用到一个修饰词weak,使用场景大家都比较清晰,避免出现对象之间的强强引用而造成对象不能被正常释放最终导致内存泄露的问题。weak 关键字的作用是弱引用,所引用对象的计数...
weak的实现原理其实很简单,概括来说就是,在内存中有一个名为weak_table_t的哈希表,weak_table_t中存储着App所有的weak对象及指针。当有对象被weak指针修饰时,会将被修饰的对象及指针添加到weak_table_t表中。当被weak指针的作用域消失时,weak指针会被销毁,随后会 从哈希表中查找对应的weak指针,并将指针置为ni...
weak_entry_t是保存某个对象的所有弱引用(weak)的结构体,目标对象可以被多个弱引用指向,weak_entry_t的其底层结构如下:struct weak_entry_t { DisguisedPtr<objc_object> referent; union { struct { weak_referrer_t *referrers; uintptr_t out_of_line_ness : 2; uintptr_t num_refs : PTR_MINUS_2;...
uintptr_t mask; //用于计算哈希的mask uintptr_t max_hash_displacement; //允许的哈希未命中的次数 }; 在weak_table_t中,持有了weak_entry_t指针,这个指针指向一个数组,数组中每个weak_entry_t代表着一个弱引用项,这个数组模拟实现了hash。 struct weak_entry_t { ...