2013-04-17 61 views
0

我已經閱讀了很多關於內存管理的內容,但仍然有些事情我現在還不能理解。這可能看起來笨拙但低於這個碼具有變量的內存問題

  1. 性能問題
  2. 存儲器浪費

該函數「位圖B = Iprocessing.Colour_style(位圖一)」需要的灰度圖像中的,並給出它的顏色和返回一個彩色圖像b

我一直在想着,因爲new關鍵字沒有被使用,變量images[1]後處理將取代舊的內容,並沒有新的內存是創意特德。

請賜教

for(int i=0; i<images.Count;i++) { 
    images[i] = Iprocessing.Colour_style((Bitmap)images[i]); 
    } 
+4

'Iprocessing.Colour_style'做了什麼? – Habib

+0

順便說一句,你的'for'循環在它的條件下有一個錯誤的錯誤。使用'我 michaelb958

+0

感謝您指出這個錯誤,它不是代碼 – electricalbah

回答

0

變量這裏有iimages(甚至對沒有看到聲明的images我不能肯定 - 它可能是一個字段)。 images這裏只是一個參考(看起來像)List<Image> - 所以整個images是4或8個字節。名單本身需要更多空間;有對象本身,加上支持數組,加上一些計數器。與交換數組中的元素交換列表中的項目不涉及在列表/數組中分配任何額外空間。

一兩件事,可能(而且幾乎可以肯定確實)原因在這裏分配是IProcessing.Color_style。它聽起來像這樣將創建一個基於舊圖像的新圖像(而不是改變舊圖像)。此外,它看起來很多像你一樣沒有處理舊圖像 - 所以如果這只是只有地方你使用該圖像,你可能會導致自己一些問題:圖像是IDisposable,並鏈接到GDI +處理;如果你不處理它們,你可能會遇到OutOfMemoryException的問題,這個問題沒有鏈接到內存,但實際上是GDI +句柄。特別是如果你有很多的備用內存,那麼垃圾收集不會非常頻繁地發生。當然,這也有點複雜,因爲如果你在其他地方(在一個控件等)使用該圖像,那麼你不要想要現在就處置!

一行不需要涉及new涉及分配(分配可以隱藏在方法調用,操作符,屬性後面);同樣,並非涉及new的每一行都需要分配(值類型將在現有位置的頂部進行初始化)。