智能指针里弱引用应该如何实现?(WeakReference/WeakPtr<T>)

弱引用(指针)指的是这样一个概念:引用不控制对象的生命周期,但是对象本身销毁后,弱引用能得到“通知”。

WeakPtr的实现思路(概念上的):(WeakPtr 1)===> (引用结构 2) <==> (实际的对象 3)

当(实际的对象3)由于调用析构函数销毁自己时,可以清除(引用结构 2)里面的信息,这样(WeakPtr 1)就得到了null,相当于被通知到了

一种可能的实现:让WeakPtr作为一个全局WeakHashMap中的item成员,每当一个对象T创建时,即以对象的id(对于Java)或者其地址(对于C++)作为WeakHashMap作为key,同时hook住对象的析构函数,当对象销毁时,从这个WeakHashMap移除此item即可。这里的场景有点像日本公司职员上班时需要往墙上挂一个木牌代表他当前在办公室里一样。

但是这个实现感觉哪里不对劲:假设实际对象3销毁后,创建一个新的对象4,4恰巧重新维护了原来2<==>3的双向引用,这种情况下,WeakPtr 1会误认为对象3实际上未被销毁,可以把这种问题称之为“名字盗用”。

所以我真的感觉不对劲:WeakPtr到底是如何实现的?

嗯,想到了一种新的可能的WeakPtr实现:让WeakPtr<T>的弱引用对象形成一个循环链表,而T的成员数据中有一个WeakPtr<T>*成员,初始为空,当第一个指向对象T的WeakPtr<T>被创建时,此成员有赋值。

假设初始弱引用a1指向A对象,其后增加了一个新的弱引用a2,然后删除a1,此时A对象中的此WeakPtr<T>*成员应该指向a2。

嗯,有时间应该看看C++ 11标准库是weak_ptr到底是怎么实现的,好像它是与shared_ptr相互关联的。但是从基本概念上,应该不会脱出我之前想到的这2种思路吧。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-12 07:35:40

智能指针里弱引用应该如何实现?(WeakReference/WeakPtr<T>)的相关文章

c++智能指针以及循环引用问题(转)

解决循环引用: 在知道存在循环引用的条件下,使用boost::weak_ptr,即弱引用来代替循环引用中的某个强引用,从而打破循环引用的环. 由于 C++ 语言没有自动内存回收机制,程序员每次 new 出来的内存都要手动 delete,比如流程太复杂,最终导致没有 delete,异常导致程序过早退出,没有执行 delete 的情况并不罕见,并造成内存泄露.如此c++引入 智能指针 . c++ 智能指针主要包括:unique_ptr,shared_ptr, weak_ptr, 这三种,其中auto

深入学习c++--智能指针(二) weak_ptr(打破shared_ptr循环引用)

1. 几种智能指针 1. auto_ptr: c++11中推荐不使用他(放弃) 2. shared_ptr: 每添加一次引用 就+1,减少一次引用,就-1:做到指针进行共享 3. unique_ptr: 一个指针同时只能有一个使用者使用 4. weaked_ptr: 与shared_ptr搭配使用 1.1 weak_ptr 参考:https://zh.cppreference.com/w/cpp/memory/weak_ptr std::weak_ptr 是一种智能指针,它对被 std::sha

引用计数的智能指针的实现

引用计数的智能指针是对<Effective C++ 条款13:以对象管理资源>的一个实现. 我们要设计一个智能指针,使他能够管理资源,在正确的实际调用资源的析构函数. 首先我们需要一个指针reference来指向资源,当智能指针构造时,用reference指针指向资源,在我们确定资源应该被析构时,我们对reference指针进行delete. 如果只有reference指针的话,只能实现出auto_ptr的效果,我们还需要添加引用计数系统counter来统计指向资源的智能指针的个数.count

C++之智能指针20170920

/******************************************************************************************************************/ 一.C++智能指针_自己实现智能指针 1.使用局部变量结合new的方式,防止new导致的内存泄漏 class sp { private: Person *p; public: sp() : p(0) {}//表明sp的构造函数 继承person的无参构造函数 sp(

cocos2d智能指针 转自:http://blog.csdn.net/nxshow/article/details/44699409

智能指针在C++11的标准中已经存在了, 分别是unique_ptr,shared_ptr,weak_ptr, 其中最常用的应该是share_ptr, 它采用引用计数的方式管理内存, 当引用计数为0的时候, 自动释放内存, 但是由于shared_ptr考虑到了线程安全, 所以会存在有较大的性能损失. 所以在实时游戏开发中, 往往不会用到shared_ptr. 在cocos2d-x3.2以及更高的版本中, cocos2d-x提供了自己的智能指针方案——RefPtr, 这套方案实际上也是模仿C++1

Boost之智能指针的类别比较

Boost智能指针--scoped_ptr boost::scoped_ptr和std::auto_ptr非常类似,是一个简单的智能指针,它能够保证在离开作用域后对象被自动释放.下列代码演示了该指针的基本应用: #include <string> #include <iostream> #include <boost/scoped_ptr.hpp> class implementation { public:     ~implementation() { std::c

C++ 资源管理(RAII)--智能指针

1. 智能指针(Smart Pointer) i. 是存储指向动态分配(堆)对象指针的类 ii. 在面对异常的时候格外有用,因为他们能够确保正确的销毁动态分配的对象 iii. RAII类模拟智能指针,见备注 2. C++11提供了以下几种智能指针,位于头文件<memory>,它们都是模板类 i. std::auto_ptr(复制/赋值) ii. std::unique_ptr  c++11 iii.std::shared_ptr  c++11 iv.std::weak_ptr    c++11

Chromium和WebKit的智能指针实现原理分析

C++不像Java一样,由虚拟机负责对象分配和释放.也就是说,开发人员使用C++编写代码时,要自己负责对象分配和释放.WebKit和Chromium都是使用C++开发的,因此它们也面临上述问题.在解决对象释放问题时,要做到在对象不需要时自动释放,因为手动释放会带来忘记释放或者释放后又继续使用的隐患.智能指针是实现对象自动释放的有效技术手段.本文就分析Chromium和WebKit的智能指针的实现. 老罗的新浪微博:http://weibo.com/shengyangluo,欢迎关注! 在现实中,

Cocos2d-x 3.2 智能指针

Cocos2d-x 3.2:智能指针 本文转载自深入理解Cocos2d-x 3.x:内置数据结构(1)智能指针 智能指针在 C++ 11 的标准中已经存在了,分别是unique_ptr,shared_ptr,weak_ptr,其中最常用的应该是share_ptr,它采用引用计数的方 式管理内存,当引用计数为0的时候,自动释放内存,但是由于shared_ptr考虑到了线程安全,所以会存在有较大的性能损失.所以在实时游戏开发中, 往往不会用到shared_ptr. 在Cocos2d-x 3.2以及更