C 中的弱引用(WeakReference)

2022-02-14 11:22:22 字數 1278 閱讀 9325

}else

只要顯示的將弱引用的target屬性附值就會得到弱引用所代表物件的乙個強引用。不過在使用物件之前要對其可用性進行檢查,因為它可能已經被**了。如 果你得到的是null(vb.net下為nothing),表明物件已經被**,不能再用了,需要重新分配乙個。如果不是null,就可以放心大膽的用 了。

接下來讓我們看weakreference的另外乙個版本,請看**3:

// public weakreference(

//   object target,

//   bool trackresurrection

//);

object obj1 = new object();

object obj2 = new object();

weakreference wref1 = new weakreference( obj1, false );

weakreference wref2 = new weakreference( obj2, true );

weakreference的另外乙個版本有兩個引數,第乙個引數和我們前面用的版本的一樣。第二個引數讓我們看一下他的原型,bool trackresurrection,跟蹤復活,是個bool型,就是是否跟蹤復活。前面的文章中我提到過需要finalize的物件在最終釋放前會有一 次復活,我們大概可以猜到第二個引數表示的意思了。如果我們第二個引數給false,這個弱引用就是乙個short weak reference(短弱引用),當gc**時,發現根中沒有這個物件的引用了,就認為這個物件無用,這時短弱引用對這個物件的跟蹤到此為止,弱引用的 target被設定為null。前面的乙個引數的建構函式版本新建的弱引用為短弱引用。如果第二個引數給true,這個弱引用就是乙個long weak reference(長弱引用)。在物件的finalize方法沒有被執行以前,target都可用。不過這是物件的某些成員變數也許已經被**,所以使 用起來要想當小心。

現在讓我們看看weakreference是如何實現的。很顯然weakreference不能直接的引用目標物件,weakreference的 target屬性的get/set是兩個函式,從某處查到目標物件的引用返回,而不是我們最常用寫的那樣直接返回或者設定乙個私有變數。gc維護了兩個列 表來跟蹤兩種弱引用的目標物件,在乙個 weakreference物件建立時,它在相應的列表中找到乙個位置,將目標物件的引用放入,很顯然,這兩個列表不是根的一部分。在gc進行記憶體**的 時候,如果要**某乙個物件,會檢查弱引用的列表,如果儲存著這個物件的引用,則將其設為null。

public class asppage : page

}

C 中的弱引用

了解弱引用之前,先了解一下什麼是強引用 例如 object obj new object 就是乙個強引用,記憶體分配乙份空間給用以儲存object資料,這塊記憶體有乙個首位址,也就是obj所儲存的資料,記憶體分配的空間中不僅僅儲存著object物件資訊,還儲存著自己 object本身 被引用的次數。...

C 中的弱引用

了解弱引用之前,先了解一下什麼是強引用 例如 object obj new object 就是乙個強引用,記憶體分配乙份空間給用以儲存object資料,這塊記憶體有乙個首位址,也就是obj所儲存的資料,記憶體分配的空間中不僅僅儲存著object物件資訊,還儲存著自己 object本身 被引用的次數。...

WeakHashMap 中的弱引用

相信很多人對weakhashmap並沒有完全理解。weakhashmap 持有的弱引用的 key。1.弱引用的概念 弱引用是用來描述非必需物件的,被弱引用關聯的物件只能生存到下一次垃圾收集發生之前,當垃圾收集器工作時,無論當前記憶體是否足夠,都會 掉只被弱引用關聯的物件。2.weakhashmap中...