diff --git a/Megrez/src/0_CSharpExtensions.cs b/Megrez/src/0_CSharpExtensions.cs
index 1e03d40..520254d 100644
--- a/Megrez/src/0_CSharpExtensions.cs
+++ b/Megrez/src/0_CSharpExtensions.cs
@@ -125,8 +125,7 @@ public EnumeratedItem(int offset, T value) {
///
/// 針對 Sandy Bridge 架構最佳化的混合優先佇列實作。
///
-public class HybridPriorityQueue
- where T : IComparable {
+public class HybridPriorityQueue : IDisposable where T : IComparable {
// 考慮 Sandy Bridge 的 L1 快取大小,調整閾值以符合 32KB L1D 快取行為。
private const int ArrayThreshold = 12; // 增加閾值以更好地利用快取行。
private const int InitialCapacity = 16; // 預設容量設為 2 的冪次以優化記憶體對齊。
@@ -223,10 +222,15 @@ private int FindInsertionPoint(T element) {
}
private void SwitchToHeap() {
- _usingArray = false;
- // 就地轉換為堆積,使用更有效率的方式。
- for (int i = (_count >> 1) - 1; i >= 0; i--) {
- HeapifyDown(i);
+ try {
+ _usingArray = false;
+ // 就地轉換為堆積,使用更有效率的方式。
+ for (int i = (_count >> 1) - 1; i >= 0; i--) {
+ HeapifyDown(i);
+ }
+ } catch {
+ Clear(); // 確保發生異常時也能清理。
+ throw;
}
}
@@ -283,6 +287,12 @@ public void Clear() {
if (_storage.Length > InitialCapacity) {
_storage = new T[InitialCapacity];
}
+ Array.Clear(_storage, 0, _storage.Length); // 清除所有參考
+ }
+
+ public void Dispose() {
+ Clear();
+ _storage = null;
}
}
} // namespace Megrez