Как проверить, правильно ли расположен мой объект? - PullRequest
4 голосов
/ 02 февраля 2010

Интересно, существует ли «хитрость», позволяющая узнать, правильно ли (полностью) расположены использованные объекты в части кода, или, другими словами, не создает утечек памяти.

Допустим, у меня есть контейнер объектов GDI (или другой, который мне нужно явно использовать)

public class SuperPen 
{
    Pen _flatPen, _2DPen, _3DPen;
    public SuperPen() 
    {
        _flatPen = (Pen)Pens.Black.Clone();
        _2DPen = (Pen)Pens.Black.Clone();
        _3DPen = (Pen)Pens.Black.Clone();
    }
}

Теперь, когда мне нужно избавиться от объектов GDI, которые я делаю:

public class SuperPen : IDisposable
{
    Pen _flatPen, _2DPen, _3DPen;
    public SuperPen()
    {
        _flatPen = (Pen)Pens.Black.Clone();
        _2DPen = (Pen)Pens.Black.Clone();
        _3DPen = (Pen)Pens.Black.Clone();
    }

    public void Dispose()
    {
        if (_flatPen != null) { _flatPen.Dispose(); _flatPen = null; }
        // HERE a copy paste 'forget', should be _2DPen instead
        if (_flatPen != null) { _flatPen.Dispose(); _flatPen = null; }
        if (_3DPen != null) { _3DPen.Dispose(); _3DPen = null; }
    }
}

Ситуация, подобная этой, может произойти, если вы добавите новый «одноразовый» объект и забудете его утилизировать и т. Д. Как я могу обнаружить мою ошибку, я имею в виду, проверить, правильно ли был удален SuperPen?

Ответы [ 4 ]

2 голосов
/ 02 февраля 2010

Не думай, что это возможно; лучшее, что вы можете сделать, это получить профилировщик (например, ants profiler ) и измерить его. Если вы обнаружите, что у вас чрезмерная утечка памяти (через профилировщик), значит, что-то не так.

Кроме использования профилировщика, я не уверен ни в каких автоматических методах, которые помогут вам идентифицировать нераспределенные ресурсы.

1 голос
/ 02 февраля 2010

Инструмент, такой как MemProfiler или ANTS Memory Profiler будет определять утечки памяти (оба имеют пробные версии).

0 голосов
/ 02 февраля 2010

Я полагаю, что FxCop (доступный отдельно или интегрированный в версии Team System VS2005 +) обнаружит это.

0 голосов
/ 02 февраля 2010

Я бы предложил использовать этот шаблон , который включает деструктор, чтобы обеспечить очистку неразмещенных предметов. Это поймает все, что вы не называете «утилизировать», и является хорошим отказоустойчивым.

...