FWIW, в GDI есть «стоковые» объекты. При создании стокового объекта его не нужно удалять, поскольку он «принадлежит» ОС.
Вы, вероятно, уже знаете о фондовых объектах, но вот ссылка , в которой есть некоторые детали.
Я не знаю, есть ли в GDI + похожие "стандартные" объекты. Я только что провел краткий поиск и не нашел никаких ссылок на такие.
В качестве теста я написал небольшую программу WinForms с обратным вызовом по таймеру (включаемую каждые 10 миллисекунд), например:
private void timer1_Tick(object sender, EventArgs e)
{
byte r = (byte)rnd.Next(0, 256);
byte g = (byte)rnd.Next(0, 256);
byte b = (byte)rnd.Next(0, 256);
System.Drawing.SolidBrush sb = new SolidBrush(Color.FromArgb(0,r,g,b));
}
Если я позволю ему работать, он будет медленно потреблять память. Наблюдая за TaskManager (не самым точным способом измерить его), потребление памяти имеет тенденцию к росту (на моей машине, построенной с .NET 4.0 VS2010, Release) примерно 20 Кбайт на обновление диспетчера задач (при максимальной частоте обновления). Если я вызываю Dispose для кисти, использование памяти имеет тенденцию к увеличению примерно на 8 Кб за обновление диспетчера задач.
Вряд ли это окончательный тест, но, похоже, он указывает на большее использование памяти с течением времени, если SolidBrush не утилизируется. Интересно, что ни я, ни дескрипторы, ни объекты GDI вообще не увеличивались при выполнении теста (в любом случае). Основываясь на прошлом опыте с утечкой ресурсов GDI, я ожидал увидеть рост объектов GDI, особенно в случае с Unpose.
В любом случае, может быть, это было информативно, а может и нет.