我有一個類,它通過分配一個內(nèi)存塊。該類實現(xiàn),我已將其設置為在類最終確定時自動釋放分配的內(nèi)存。但是,它似乎未按預期工作。MappedMemoryMarshal.AllocHGlobal()IDisposableclass MappedMemory : IDisposable{ private bool disposed_ = false; private IntPtr memoryPtr_; public MappedMemory( int capacity ) { memoryPtr_ = Marshal.AllocHGlobal( capacity ); } ~MappedMemory() { Dispose( false ); } public void Dispose() { Dispose( true ); GC.SuppressFinalize( this ); } protected virtual void Dispose( bool disposing ) { if ( !disposed_ ) { if ( disposing ) { // Clear managed resources } Marshal.FreeHGlobal( memoryPtr_ ); } disposed_ = true; }}我已經(jīng)編寫了兩個測試來確保內(nèi)存被正確釋放:public MappedMemory_finalizer_frees_memory(){ for( var i = 0; i < 1e8; i++ ) { var memory = new MappedMemory( 128 ); }}public MappedMemory_dispose_frees_memory(){ for( var i = 0; i < 1e8; i++ ) { var memory = new MappedMemory( 128 ); memory.Dispose(); }}運行測試時,手動調(diào)用的測試將按預期工作,并且內(nèi)存保持恒定利用率。Dispose()但是,終結(jié)器的測試似乎沒有釋放分配的內(nèi)存,并且在內(nèi)存耗盡之前會失控泄漏。我設置了一個斷點,并且命中了對的調(diào)用。Marshal.FreeHGlobal( memoryPtr_ )手動添加到測試中可以解決問題,因此最終看起來內(nèi)存已解除分配,但未被垃圾回收?GC.Collect()我對這里發(fā)生的事情感到非常困惑。有人可以解釋為什么終結(jié)器不能釋放內(nèi)存,以及我如何確保它在生產(chǎn)中釋放內(nèi)存嗎?
C# 終結(jié)器未釋放非托管內(nèi)存
函數(shù)式編程
2022-09-04 16:23:27