有垃圾回收(GC)時,區分記憶體管理與資源管理至關重要。GC 僅管物件記憶體配置/釋放,不管資料庫連線、核心物件控制代碼等非記憶體資源。
new 配置,delete 釋放,精確控制但易洩漏。newobj IL 指令配置託管物件,無對應 delete,GC 自動回收。gcnew 區分託管物件:DateTime stackObj(2003,1,18); // 值類型,堆疊
MemoryStream^ heapObj = gcnew MemoryStream(); // 參考類型,GC 堆
^ 隨 GC 移動物件自動更新,可重新繫結,支援運算子多載(原生指標不支援)。gcnew 明確指示配置於 GC 堆,new 僅用於原生類型。CLR 無類似解構函數的機制,採用 IDisposable 介面模式,需手動呼叫 Dispose()。C# 用 using/try-finally 確保釋放。
ref class 實例宣告於堆疊,離開作用域自動呼叫解構函數(~T())。Dispose(),終結子 (!T()) 對應 Finalize()。Dispose() 時,終結子確保非託管資源釋放。ref class ResourceWrapper {
~ResourceWrapper() { /* Dispose: 釋放託管+非託管 */ }
!ResourceWrapper() { /* Finalize: 僅釋放非託管 */ }
};
// 使用:決定性清理
void Use() {
ResourceWrapper r; // 堆疊語意
r.DoWork();
} // 自動呼叫 ~ResourceWrapper()
Dispose(),無需手動 base.Dispose()。Using<T> 模板模擬 C# using 區塊。C++/CLI 結合決定性清理與 GC,提供最優雅的資源管理模型。