Как все отметили, команда игроков не является списком игроков. Эта ошибка совершается многими людьми во всем мире, возможно, на разных уровнях знаний. Часто проблема тонкая, а иногда и очень грубая, как в этом случае. Такие проекты плохи, потому что они нарушают Принцип замещения Лискова. В Интернете есть много хороших статей, объясняющих эту концепцию, например http://en.wikipedia.org/wiki/Liskov_substitution_principle
Итак, есть два правила, которые должны быть сохранены в отношениях между родителями и детьми между классами:
Другими словами, родитель является необходимым определением для ребенка, а ребенок является достаточным определением родителя.
Вот способ продумать одно решение и применить вышеприведенный принцип, который должен помочь избежать такой ошибки. Следует проверить гипотезу, проверяя, действительны ли для всех классов родительский класс для производного класса как структурно, так и семантически.
Как вы видите, только первая характеристика списка применима к команде. Следовательно, команда не является списком. Список будет деталью реализации того, как вы управляете своей командой, поэтому ее следует использовать только для хранения объектов игрока и манипулировать с помощью методов класса Team.
На этом этапе я хотел бы отметить что класс Team должен, на мой взгляд, даже не реализовываться с использованием List; в большинстве случаев он должен быть реализован с использованием структуры данных Set (например, HashSet).
Мы используем EurekaLog на нашей работе в Дельфи 7. Это - компонент обработчика исключений, который дает очень подробную информацию об исключениях (включая стек вызовов! переменные среды, и т.д.) даже для нарушений прав доступа. Но другая замечательная особенность - то, что можно сказать его ошибке на утечках памяти также, которая показывает точную строку кода, где память/объект была выделена во-первых! Это - коммерческий продукт, но я все еще настоятельно рекомендовал бы его.
FastMM является свободным (доступный источник) детектор утечки памяти, уже интегрированный в последних версиях Дельфи. У меня никогда не было потребности ни в чем больше.
Это - намного лучший BTW для ограничения возможностей утечек памяти при кодировании, вместо того, чтобы найти их позже. Некоторые подсказки:
Всегда использование пытаются наконец в Вашем коде для освобождения созданных объектов. Лучше записать этот код сразу, и затем записать код для использования объектов. Еще лучше использовать функциональность IDE как Шаблоны Кода.
Только функции использования, которые возвращают динамично выделенные объекты при необходимости. Обычно лучше передать объекты как параметры, чем создают и возвращают их. Например, это
procedure getChoices(var AChoices: TStrings);
было бы намного лучше, чем
function getChoices: TStrings;
, поскольку нет никакого потенциала случайно утечки созданного объекта TStrings.
Я рекомендовал бы полную FastMM4-версию по версии, включенной в Дельфи. Полная версия дает Вам полный и подробный отчет, зарегистрированный в файл вместо dialogbox. Объединитесь это с homebrewed 'memoryleak-logfile-differ' Ваш все установлено для выхода bughunt.
AQTime очень хорош. Это также делает другие вещи как профилирование для производительности. И это не требует никаких изменений в Вашем коде. Конечно, компиляция с информацией об отладке помогает предоставлению лучших результатов.
Можно хотеть поглядеть на этой сессии CodeRage 2: Утечки памяти Борьбы для Макетов . Это главным образом показывает, как использовать FastMM для предотвращения/обнаруживания утечек памяти в Дельфи. Был для D2007, но все еще важен для D2009.
FastMM очень хорош. Я знаю 3 или 4 менеджеров по свободной памяти для Дельфи. Это берет меньше, чем час для проверки всех их, причина обычно, они требуют всего 3 строк кода к embed'em в проекте.
Я использую MadExcept , потому что это бесплатно для личного использования.