set obj = nothing這句話沒有釋放,如果在創建了obj以后再set obj =new class的話以前的那個也沒有被卸載,而只是多了一個obj,以前的obj和obj創建的物件依然存在,如何真正釋放class創建的obj
uj5u.com熱心網友回復:
set obj = nothing這句話沒有釋放//
你是如何知道沒有釋放的?
uj5u.com熱心網友回復:
set obj = nothing減少物件的參考計數,只有當參考物件的最后一個變數置為nothing后才會真正釋放,如:dim o1 as class
dim o2 as class
set o1=new class
set o2=o1
set o1=nothing '這里物件不會被釋放,只是減少參考計數
set o2=nothing '這里才會真正釋放
uj5u.com熱心網友回復:
那你肯定是物件之間存在回圈參考了uj5u.com熱心網友回復:
《高級Visual Basic編程(Advanced Visual Basic)》第六章 回圈參考
整整一章的內容講這個,比這里零零碎碎地討論完整多了。
認真學習吧!
uj5u.com熱心網友回復:
高級Visual Basic編程uj5u.com熱心網友回復:
dim o1 as class ' 這個你認為在記憶體里會是什么樣的一個東西?一個含帶代碼的記憶體結構體?
' 這只不過是個4位元組的記憶體地址指標,而且目前沒有指向任何地址
dim o2 as class ' 當然,這個也不例外,也只不過是個空指標
set o1=new class ' 到了這里才開始動態分配記憶體,創建出類實體的結構體
set o2=o1 ' 這里只不過是讓兩個指標同時指向一個記憶體地址而已,說明的是同一個類實體
' 難道你認為到這里就會分裂出兩個類實體?一個是原來的,
' 另一個是應為賦值而新 new 出來的新實體?
set o1=nothing ' 如果 VB 不會應為賦值陳述句導致自動 new 新的實體物件,那么這里就已經完成
' 了釋放程序。當然,也可能沒釋放完,可能是因為那個類本身用了API來動態創建
' 資源,然后沒有在類釋放事件中釋放干凈。但是這是屬于類程式撰寫的問題,而不是
' 類應用的問題。
set o2=nothing ' 這個就完全是多余的了
uj5u.com熱心網友回復:
怎么說也在csdn看見你很多次了,怎么連這個都不知道呢,set obj =nothing并不是吧物件賦值為空,只是把指標賦值為空
uj5u.com熱心網友回復:
具體有沒有出現回圈參考的情況我現在還沒有弄清,但是出現物件注銷不了的情況是確定的uj5u.com熱心網友回復:
的確,這個問題是我疏忽了,我一直以為 VB 的Set Obj=Nothing 和 VC 里的 delete(obj); 是一樣的效果了,但經過測驗,的確不一樣。不過有一點你說錯了,set obj = nothing 并不只是把指標賦值為空,而是觸發了某個程序來處理類實體記憶體里的資料。我通過觀察記憶體得知,VB 當 new 一個類實體的時候,這個類實體記憶體中有一個參考物件基數,而這個基數初始值是1,如果在程式里用了類似 Set o2=o1 這種類賦值的用法,這個類實體的參考物件基數會加1,同時,這個 o2 的地址也會被記錄到類實體的參考串列記憶體中。當然,如果還有更多的類似 Set o3=o1、Set o4=o1 這種用法也會讓這個基數繼續加1,且同樣會記錄參考物件地址到實體記憶體區,之后,如果要釋放這個類實體,必須對每一個參考物件做一次set obj = nothing操作,因為只有這樣才能對應上實體里記錄的每一個參考物件串列項,只有地址對應了,VB才會對那個參考物件基數進行減1操作,直到那個基數值為1時,相應還在參考物件串列的物件再做 set obj = nothing 操作時,才會最后觸發類里的Terminate 程序和 VB 內部的資源釋放程序。而這一系列的操作,并不只是像你說的設定某個指標地址那么簡單,而是通過 set obj = nothing 這種 VB 上的寫法,被 VB 轉譯成了一個復雜的執行程序。
uj5u.com熱心網友回復:
不錯!不過這一點Msdn中關于set obj =nothing已有說明
uj5u.com熱心網友回復:
VB的資源,會在超過作用域后自動釋放的,這一點特別讓我懷念,不像C#、VB.NET提供了狗屁的垃圾自動回識訓制(雖然可以通過GC提前不安全地回收)。uj5u.com熱心網友回復:
VB中的物件是由VB來管理的,VB中的new和VC中的new在行為上是兩碼事,雖然表面上看起來一樣,這也是VB中沒有delete(obj)的原因,VB會自動去做這樣的事,帶來的好處就是VB程式員不用太那么關心記憶體泄漏等等的問題;vb中的set obj =nothing更像是一種申請,請求VB釋放物件,但釋不釋放是取決于VB的物件管理器,VB的物件管理器使用參考計數來決定物件的存留,當參考計數等于0時就釋放,反之則一直會存在。
如果不能釋放物件,那就只有兩個原因,要么如前面所說回圈參考,要么這個物件不是VB的物件管理器創建的(沒用VB的new來創建)
uj5u.com熱心網友回復:
謝謝各位了,本人比較菜,還是有點時不時的不能釋放cls的物件uj5u.com熱心網友回復:
如何知道某個物件的參考計數是多少呢?有時候希望計數等于1就釋放,而不是到0的時候由VB自動釋放轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/150567.html
標籤:API
上一篇:vb如何呼叫excel里面的影像
