Что лучший инструмент должен обнаружить утечки памяти в [закрытом] Delphi

Как все отметили, команда игроков не является списком игроков. Эта ошибка совершается многими людьми во всем мире, возможно, на разных уровнях знаний. Часто проблема тонкая, а иногда и очень грубая, как в этом случае. Такие проекты плохи, потому что они нарушают Принцип замещения Лискова. В Интернете есть много хороших статей, объясняющих эту концепцию, например http://en.wikipedia.org/wiki/Liskov_substitution_principle

Итак, есть два правила, которые должны быть сохранены в отношениях между родителями и детьми между классами:

  • a Ребенок не должен иметь никакой характеристики, которая меньше, чем то, что полностью определяет родителя.
  • Родитель должен не требовать характерный в дополнение к тому, что полностью определяет ребенка.

Другими словами, родитель является необходимым определением для ребенка, а ребенок является достаточным определением родителя.

Вот способ продумать одно решение и применить вышеприведенный принцип, который должен помочь избежать такой ошибки. Следует проверить гипотезу, проверяя, действительны ли для всех классов родительский класс для производного класса как структурно, так и семантически.

  • Является ли футбольная команда списком футболистов? (Все ли свойства списка относятся к команде в том же значении) Является ли команда коллекцией однородных объектов? Да, команда - это сборник игроков. Является ли порядок включения игроков в описание состояния команды и обеспечивает ли команда сохранение последовательности, если она явно не изменена? Нет, и Нет. Ожидается, что игроки будут включены / сброшены на основе их последовательной позиции в команде? Нет

Как вы видите, только первая характеристика списка применима к команде. Следовательно, команда не является списком. Список будет деталью реализации того, как вы управляете своей командой, поэтому ее следует использовать только для хранения объектов игрока и манипулировать с помощью методов класса Team.

На этом этапе я хотел бы отметить что класс Team должен, на мой взгляд, даже не реализовываться с использованием List; в большинстве случаев он должен быть реализован с использованием структуры данных Set (например, HashSet).

26
задан Bruce McGee 16 March 2010 в 16:09
поделиться

7 ответов

Мы используем EurekaLog на нашей работе в Дельфи 7. Это - компонент обработчика исключений, который дает очень подробную информацию об исключениях (включая стек вызовов! переменные среды, и т.д.) даже для нарушений прав доступа. Но другая замечательная особенность - то, что можно сказать его ошибке на утечках памяти также, которая показывает точную строку кода, где память/объект была выделена во-первых! Это - коммерческий продукт, но я все еще настоятельно рекомендовал бы его.

19
ответ дан CodeAndCats 28 November 2019 в 06:02
поделиться

FastMM является свободным (доступный источник) детектор утечки памяти, уже интегрированный в последних версиях Дельфи. У меня никогда не было потребности ни в чем больше.

Это - намного лучший BTW для ограничения возможностей утечек памяти при кодировании, вместо того, чтобы найти их позже. Некоторые подсказки:

Всегда использование пытаются наконец в Вашем коде для освобождения созданных объектов. Лучше записать этот код сразу, и затем записать код для использования объектов. Еще лучше использовать функциональность IDE как Шаблоны Кода.

Только функции использования, которые возвращают динамично выделенные объекты при необходимости. Обычно лучше передать объекты как параметры, чем создают и возвращают их. Например, это

procedure getChoices(var AChoices: TStrings);

было бы намного лучше, чем

function getChoices: TStrings;

, поскольку нет никакого потенциала случайно утечки созданного объекта TStrings.

37
ответ дан mghie 28 November 2019 в 06:02
поделиться

Я рекомендовал бы полную FastMM4-версию по версии, включенной в Дельфи. Полная версия дает Вам полный и подробный отчет, зарегистрированный в файл вместо dialogbox. Объединитесь это с homebrewed 'memoryleak-logfile-differ' Ваш все установлено для выхода bughunt.

14
ответ дан Vegar 28 November 2019 в 06:02
поделиться

AQTime очень хорош. Это также делает другие вещи как профилирование для производительности. И это не требует никаких изменений в Вашем коде. Конечно, компиляция с информацией об отладке помогает предоставлению лучших результатов.

13
ответ дан Lars Truijens 28 November 2019 в 06:02
поделиться

Можно хотеть поглядеть на этой сессии CodeRage 2: Утечки памяти Борьбы для Макетов . Это главным образом показывает, как использовать FastMM для предотвращения/обнаруживания утечек памяти в Дельфи. Был для D2007, но все еще важен для D2009.

7
ответ дан François 28 November 2019 в 06:02
поделиться

FastMM очень хорош. Я знаю 3 или 4 менеджеров по свободной памяти для Дельфи. Это берет меньше, чем час для проверки всех их, причина обычно, они требуют всего 3 строк кода к embed'em в проекте.

7
ответ дан 28 November 2019 в 06:02
поделиться

Я использую MadExcept , потому что это бесплатно для личного использования.

4
ответ дан rajeemcariazo 28 November 2019 в 06:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: