Это маловероятно, Windows позволит вам слить 10 000 дескрипторов, прежде чем станет раздражаться из-за того, как ведет себя ваша программа, и откажется выделять больше. К тому времени вы израсходовали огромные объемы виртуальной памяти для пиксельных данных в растровых изображениях. Хранится в неуправляемой памяти, сборщик мусора не знает об этом. Пространство виртуальной машины, которое не освобождается, пока вы не вызовете Dispose() или сборщик мусора не позаботится об этом, запустив финализатор.
Сборщик мусора обычно не выполняет свою работу, класс Bitmap — это очень маленький объект, недостаточно большой, чтобы сам по себе запускать сборщик мусора. Вам нужно выделить около 60 000 из них, чтобы вызвать GC. Вы никогда не доберетесь туда, сначала вам не хватит места для виртуальной машины, если только растровые изображения не очень маленькие, а затем обрабатываются. Вызов Dispose() является необязательным, но он перестает быть необязательным для растровых изображений, поскольку финализатор просто не может выполнить работу вовремя.
Объем оперативной памяти не играет никакой роли в этом, программа .NET всегда бомбит ее, не имея возможности найти дыру в адресном пространстве виртуальной машины, достаточно большую, чтобы соответствовать запрошенному размеру. Также проблема с растровыми изображениями, им, как правило, нужны большие дыры. Достаточно загрузить DLL по неудобному базовому адресу, чтобы разрезать большую дыру на две части. В противном случае проблема, которую легко решить, просто установите целевую платформу программы на AnyCPU. Тестовая программа имеет для этого значение конфигурации. Работает на этой машине Win7. Но, конечно, это не веская причина пропускать вызовы Dispose().
person
Hans Passant
schedule
30.09.2013