Создание и освобождение объектов

Hug
Дата: 03.12.2007 09:56:57
       var
              List,List1 : TList

       List:=TList.Create;
       List1:=UniSort(List);
       List:=TList.Create;
       List:=List1;
       List.Free;


       function UniSort(L:TList):TList;
       var
               NList:TList;
               i : integer
        begin
               NLIst:=TList.Create;
               for  i:=0 to L.Count-1 do
                   NList.Add(L.Items[i]);
               L.Free;
               Result:=NList;
        end;

end;


Вот имеется такой код. При вызове функций на разе 4-5 выпадает аксесс виолейшн. то есть ошибка не стабильная. выпадает иногда. мне кажется ошибка при работе с памятью. Правильно я работаю с объектами? Подскажите пожалуйста
MAX2002
Дата: 03.12.2007 10:01:50
Вобщем приведенного тобой куска кода не достаточно, можно посоветовать только одно
       function UniSort(L:TList):TList;
       var
               NList:TList;
               i : integer
        begin
               NLIst:=TList.Create;
               for  i:=0 to L.Count-1 do
                   NList.Add(L.Items[i]);
               L.Free;
               Result:=NList;
        end;
Проверяй корректность передаваемого параметра L:TList.
PROeXT
Дата: 03.12.2007 10:05:12
А вообще, при работе с объектами рекомендуется перед обращением к его свойству или методу проверять объект на существование... К примеру, IF Assigned(объект) или Объект <>Nil... ХЗ, какие случаи могут возникнуть
Anatoly Podgoretsky
Дата: 03.12.2007 10:12:00
автор
Правильно я работаю с объектами?

Совсем неправильно, сплошные утечки памяти.
NextMan
Дата: 03.12.2007 14:27:25
Hug
...
  List := TList.Create; // Создал объект №1
  List1 := UniSort(List); // Создал объект №2, убил объект №1
  List := TList.Create; // Создал объект №3;
  List := List1; // Потерял объект №3
  List.Free; // Убил объект №2
...
...


1. Потерялся объект №3.
2. Код бессмысленный, имхо.
Anatoly Podgoretsky
Дата: 03.12.2007 14:36:17
Потерялись все три объекта, плюс возможное AV - диагноз переписать все нафиг.
Naf
Дата: 03.12.2007 14:38:49
Anatoly Podgoretsky
Потерялись все три объекта, плюс возможное AV - диагноз переписать все нафиг.


Не согласен, объекты № 1 и № 2 успешно удалены
Bulygin Roman
Дата: 03.12.2007 16:09:23
Hug
Правильно я работаю с объектами? Подскажите пожалуйста

Это.. это просто ужасно, что выделаете! От того и AV.

Во-первых, желательно объекты создавать/удалять на одном и том же уровне видимости. Т.е. создали объект, попользовались, удалили. Это либо внутри одного блока begin-end, либо в конструкторе/деструкторе объекта владельца.
Во-вторых, желательно использовать конструкции try-finally-end для корректного освобождения памяти при исключительных ситуациях.

UniSort грешит двумя вещами. Во-первых, она убивает переданный ей объект параметр. Это очень порочная практика. Во-вторых, она является фабрикой объектов, хотя это не заявлено в названии. Ну и наконец, она вообще не делает ничего полезного.



function CreateSortedList(L:TList):TList;
var
  i: integer;
begin
  Result := TList.Create;
  try
    for  i := 0 to L.Count-1 do
      Result.Add(L.Items[i]);
  except // мало ли что у нас там за Add...
    Result.Free;
    raise;
  end     
end;

var
  List, List1 : TList;
begin
  List:=TList.Create;
  try
    List1 := CreateSortedList(List);
    try
      // что-то ещё творим 
    finally
      List1.Free
    end
  finally
    List.Free
  end
end.
Anatoly Podgoretsky
Дата: 03.12.2007 16:59:30
Naf
Anatoly Podgoretsky
Потерялись все три объекта, плюс возможное AV - диагноз переписать все нафиг.


Не согласен, объекты № 1 и № 2 успешно удалены

Не можешь ли показать где и подтвердить свои слова?
Пока я вижу

       List:=TList.Create;
       List1:=UniSort(List); Потерян объект созданый в UniSort
       List:=TList.Create; Потерян объект созданый в первой строке
       List:=List1; Потерян последний третий объект 
Bulygin Roman
Дата: 03.12.2007 19:15:07
Anatoly Podgoretsky

       List:=TList.Create;
       List1:=UniSort(List); Потерян объект созданый в UniSort
       // нет он не потерялся. Внутри UniSort он был присвоен Result, 
       // а Result в свою очередь присвоен List1,

       List:=TList.Create; Потерян объект созданый в первой строке
       // То, что было в List, уже успешно удалено внутри UniSoft

       List:=List1; Потерян последний третий объект 
       // Вот тут единственное место, где действительно теряется