C程式釋放資源的問題?謝謝,C 釋放資源

2022-12-09 11:56:18 字數 3217 閱讀 1930

1樓:匿名使用者

gc,一個服務clr的。有兩個特點,前人的總結。但不是scott他們說的。我是這麼翻譯的:

1.當程式不再執行的時候,gc可以從記憶體中刪除物件。

2.gc在原則上釋放那些不得不釋放的程式任務,比如釋放你所要求的釋放(dispose)的和造成記憶體溢位的程式。

實際上我認為在伺服器上打上framwork2.0的補丁為前提下,你必修寫上dispose.而且要是你參照一些個翻譯錯誤的書來寫,你吃的虧會很大。

為什麼?問題在於你所開發的系統上了2000流量,若是電子商務**,弄不好將因為你的造成的事故而死去。一天損失上萬。

所以,伺服器記憶體釋放你必須考慮下。否則後果自負。自己寫個類吧!

公司老大格言,.net 是個框,你要在已經打上樁的框中編寫你自己的未來(實際vs並不美好)

"寫" 請自己參考clr

2樓:末日高督

不用,因為在c#中,在我們操作問以後,程式會自動釋放資源.當然,我們如果手動釋放這是個好習慣.

3樓:

如果cmd和conn要頻繁的使用 倒不如宣告為類中的全域性變數 這樣執行程式只需要初始化一次 釋放一次

比如這樣

class form1

}如果只是偶爾用一下 用過之後就dispose掉比較節省資源

4樓:匿名使用者

其實你可以把資料庫訪問相關函式寫到一個類中,要訪問時呼叫這個類的相關函式就可以了,不用每次都去寫這些**。c#會自動釋放資源,這個不用太擔心,他們的生存期到了,自然會**,當然寫上也沒問題,資源不用就釋放,我覺得應該這樣,下次用下次再分配。但是你的open和close等最好是要加上捕捉錯誤的**,因為網路等原因,可能導致訪問的失敗。

c#釋放資源

5樓:匿名使用者

不需要手動釋放,你可以使用完之後,就test = null,這是一個好習慣,下次.net自動gc時就會把這些資源給**掉。

所以說,你是不用手動去釋放的。

6樓:匿名使用者

dispose是用來釋放非託管資源的,並不會釋放託管資源,new是從託管堆中分配得資源,只能通過gc**,無法手動釋放。你可以使用system.gc.

collect()來強制進行gc,用system.gc.waitforfullgccomplete()等待gc完成。

如果你確實需要,使用system.runtime.interopservices.

marshal來手動申請和釋放非託管記憶體,但是,其中無法儲存託管物件,只能儲存整型、浮點型和字元型及其陣列,或者具有structlayout或marshalas特性的結構或類。 (會帶來一定的執行期代價)

7樓:匿名使用者

如果你是新手的話,儘量不要嘗試手動釋放,事實上,c#的自動釋放是很優秀的。當然了,有很多情況下,我們對資源的把握需要我們解除安裝之前的一些資源用來用來繼續使用,就像很多類都提供了解除安裝的一些方法,我常常在自己的類裡寫一個任意命名的方法,用作解除安裝,且將這個方法在該類的自動解除安裝中引用(事實上,很多情況要自己解除安裝,比如套接字)可以保證自動解除安裝時他被解除安裝。

綜上所述,c#中只有少部分需要自行解除安裝,其他都可以由其自動解除安裝。當然,如果你是大師級,以上全是我的夢遊之語。

8樓:caffeine致死

c#的設計者不允許開發者自行**垃圾,沒有任何語法支援直接垃圾**,只有runtime才能決定何時釋放資源。可以使用unsafe,using**塊以及dispose方法來實現資源管理(自己查),也可以使用system.gc.

collect來強制垃圾**,但是ms不推薦這樣做,因為當方法結束時,你還是不知道物件是否已經被摧毀!!!!!!!!!!!!!!!!!

另外,如果要一個值型別的值為null,比如一個int值,宣告時必須這樣寫(加問號):int? myint;

9樓:歐陽藝華

資源釋放,c#一般是使用自帶的gc,如果想自己實現包含dispose方法的型別,可以手動實現idisposable介面,不過這個介面的實現很有技巧性,需要自己寫一個釋放託管的和釋放非託管的!

如果想直接在使用完陣列就釋放掉,一般可以使用unsafe**塊,或者更底層的換個語言來做這樣大資料量計算的模組!

10樓:匿名使用者

c#有一個自動的**機制,它會檢測是否該資源有用,如果它發現沒有,就會有垃圾**器(gc)**資源

11樓:匿名使用者

強制性的gc.collect()

但微軟不推薦這麼用

12樓:higer愛

。net是託管的,自動管理記憶體!你可以查查

c# 如何解決 窗體關閉還不釋放資源的問題

13樓:匿名使用者

你左轉右轉把**儲存到本地替換掉這個動作肯定沒關閉流連線。

這樣你關閉了窗體,但整個應用程式程序還在,這個程序就佔用著這些**,所以你刪除的時候就報錯了。

你仔細看看你替換**那部分的**,看看有沒有資源沒釋放的。

14樓:

你自定義的pic控制元件嗎?可能使用了多執行緒,導致你關閉了窗體執行緒後其他執行緒依然存在,導致沒有被釋放。

如何讓c#立即釋放資源

15樓:匿名使用者

1、你檢視一下你所用控制元件的屬性,是否有關閉檔案控制代碼的相關屬性,因為程式要寫檔案,會先開屬一個io,完成操作後,需把這個io通道關閉,不然那個檔案,系統認為是正在開啟狀態.

2、如果該控制元件不提供關閉檔案控制代碼方法,可在儲存之後直接呼叫 gc.collect();手動清理垃圾。

c#中如何釋放在關閉窗體時釋放窗體資源

16樓:龍天騎士

垃圾**由gc託管,不是每時每刻都會立即**,除非你呼叫gc.collect()強制gc立即進行**

託管資源在窗體關閉時會自動釋放的,其他資源如 gdi 等需要你自己釋放

也可以嘗試this.dispose() 在關閉事件裡寫

17樓:踏浪帥

你不用寫**的!c#在你關閉時會自動幫你清空的!

c#file類釋放資源的問題

18樓:陽光的雷咩咩

為什麼要create兩次

c語言釋放連結串列記憶體的問題,C語言釋放連結串列記憶體的問題

把連結串列建立的函式貼出來。否則難以判斷。還有lnode 和linklist的型別定義貼出來再請求一次,把lnode 和linklist的型別定義貼出來!從 l next 的用法,我推測linklist是一個結構體指標型別,作用是指向連結串列頭。可是你在malloc的時候,用的sizeof link...

C 物件建立釋放,C 物件建立釋放

你得用指標陣列來放著你所有new出來的物件的指標,你說的這種方式,註定了記憶體洩漏,因為你已經沒法找到前4個物件的指標了。你new5個物件就要有5個指標啊,不去建立個指標陣列,像你這樣已經找不回了,也沒有銷燬,已經記憶體洩露了好吧?你又一個筆記本,你想記上5親朋好友的聯絡 地址 姓名等等。但奇怪的很...

C 如何開闢空間,在C 中如何釋放NEW開闢的空間

你第二行申請了5個int的空間,裡面存了東西,那麼你又增加了5個空間,那麼你需要一箇中轉的指標,用新建的中轉指標開闢10個空間,然後把原有空間中的內容存到新開闢的空間中,delete掉原來申請空間,之後在讓原來指標指向新申請空間,然後將中轉指標置null。這樣就變成你所要求的內容了 這是我該的程式 ...