首页 > 其他分享 >弱引用

弱引用

时间:2023-08-26 17:44:54浏览次数:24  
标签:obj self 引用 child data 内存

弱引用(Weak Reference)是编程语言中的一个概念,用于在某些情况下防止循环引用并避免内存泄漏。它在内存管理和垃圾回收的背景下发挥作用。

 

循环引用:循环引用指的是对象之间形成了一个循环的引用链,导致这些对象都无法被垃圾回收,即使它们已经不再被程序所使用。这可能会导致内存泄漏,因为这些无法回收的对象会一直占用内存。

内存泄漏:内存泄漏是指程序中分配的内存资源在不再需要时没有被正确释放,导致可用内存逐渐减少,最终可能导致程序或系统崩溃。

 

弱引用的作用就是为了解决循环引用导致的内存泄漏问题。弱引用不会增加被引用对象的引用计数,这意味着只要没有其他强引用指向被引用对象,即使有弱引用存在,该对象也可以被垃圾回收。

 

在很多编程语言中,弱引用通常被用来创建一种非侵入式的引用,以允许某些对象在没有强引用的情况下被自动释放。最常见的使用场景之一是缓存,其中你可能希望缓存的对象在内存不足时能够被回收,而不是一直占用内存。

示例:

1 import weakref
2 
3 class MyClass:
4     pass
5 
6 obj = MyClass()
7 weak_ref = weakref.ref(obj)  # 创建一个弱引用

在这个例子中,weakref.ref() 创建了一个指向 obj 的弱引用。如果没有其他强引用指向 obj,那么 obj 可能会被垃圾回收,弱引用将变成 None。

防止循环引用:

 

class Parent:
    def __init__(self):
        self.child = None

    def set_child(self, child_obj):
        self.child = weakref.ref(child_obj)

class Child:
    def __init__(self, parent_obj):
        self.parent = parent_obj

parent = Parent()
child = Child(parent)
parent.set_child(child)

# 如果不使用弱引用,这里将形成循环引用

在这个例子中,如果不使用弱引用,ParentChild 之间会形成循环引用,导致它们无法被正确回收。通过使用弱引用,可以避免这种情况。

缓存使用弱引用:

import weakref

class Cache:
    def __init__(self):
        self.cache_data = weakref.WeakValueDictionary()

    def get_data(self, key):
        if key in self.cache_data:
            return self.cache_data[key]
        else:
            data = self.load_data_from_disk(key)
            self.cache_data[key] = data
            return data

在这个例子中,WeakValueDictionary 是一个 Python 中的弱引用字典类型,用于实现缓存。当内存不足时,缓存中的对象会被垃圾回收,从而释放内存。

总之,弱引用是一种有助于防止循环引用和内存泄漏的机制,通过允许对象在没有强引用的情况下被垃圾回收。在需要管理对象生命周期和内存消耗的场景中,使用弱引用可以提供一种有效的解决方案。

标签:obj,self,引用,child,data,内存
From: https://www.cnblogs.com/allenxx/p/17659186.html

相关文章

  • C++11 右值引用&&、移动语义std::move、完美转发std::forward
    参考:https://blog.csdn.net/HR_Reborn/article/details/130363997 #pragmaonceclassArray{public:Array():size_(0),data_(nullptr){}Array(intsize):size_(size){data_=newint[size_];}//复制构造函数(深拷贝构造)A......
  • EF 多对多循环引用序列化失败 解决办法
    解决办法:外键添加[JsonIgnore]特性即可解决 ///<summary>///文章相册///</summary>[Table("ArticleAlbum")]publicclassArticleAlbumModel{///<summary>///主键ID///</summary>[Display(Name="主键ID")]......
  • 一个引用没效果错误示范
    #include<iostream>#include<unordered_map>usingnamespacestd;classTestClass{public:std::unordered_map<int,int>&GetData(){returnm_data;}private:std::unordered_map<int,int>m_data;};intmain(){T......
  • 引用数据类型的坑
    Integer2!= Integer2巨坑 最近遇到一个奇怪的问题,存到user中的某个key的数据类型变了下面这段代码,本来是图方便获取了map,然后将list转成string,然后put回到这个map,然后使用这个map却不成想,类型也跟着变了。 这就是引用类型使用的风险 importjava.util.ArrayLis......
  • C++内联函数、引用、强制类型转换
    三、内联函数inline1、普通函数普通函数会被编译成二进制指令存储在代码段中,调用语句会生成一条跳转指令,当程序运行到调用语句时,会跳转该函数在代码段中对应的位置执行,执行结束会返回2、什么是内联函数内联函数也会被翻译成二进制指令,但调用语句不会生成跳转指令,而是直接把内......
  • 基本数据类型和引用数据类型
     目录前言导语总结前言我是歌谣我有个兄弟巅峰的时候排名c站总榜19叫前端小歌谣曾经我花了三年的时间创作了他现在我要用五年的时间超越他今天又是接近兄弟的一天人生难免坎坷大不了从头再来歌谣的意志是永恒的放弃很容易但是坚持一定很酷导语基本数据类型和引用数据类......
  • 静态方法引用
    静态方法引用格式类名::静态方法成员方法对象::成员方法本类this::方法父类super::方法名引用构造方法格式类名::new 使用类名引用成员方法String::substring方法引用规则,1需要有函数接口2方法必须存在3被引用形参和抽象方法的第二个形参到最后一个形参必须保持......
  • GC面临的困境,JVM是如何解决跨代引用的?
    本文已收录至GitHub,推荐阅读......
  • GC面临的困境,JVM是如何解决跨代引用的?
    本文已收录至GitHub,推荐阅读......
  • QT将资源打包为外部资源文件进行引用
    QT将资源打包为外部资源文件进行引用将资源打包为外部资源文件进行引用,这样能减少可执行程序exe的大小,在调试运行时需要将相应的rcc复制到对应的Debug或release目录下,否则会加载不了资源对应的qrc应该类似于myres.qrc<RCC><qresourceprefix="/"><file>res/img_bg_level_1.jpg</......