Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Утечка памяти - TStrings.AddObject(), Очистка обЪектов в TStrings 
V
    Опции темы
Romikgy
Дата 18.7.2006, 12:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 26
Всего: 146



Цитата(Siton @  18.7.2006,  11:30 Найти цитируемый пост)
можноли передать в функцию не переменную а указатель?

Можно , но имхо и так все объекты передаются только указателями в дельфи 


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Siton
Дата 18.7.2006, 12:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 17.7.2006

Репутация: нет
Всего: нет



Объект добовляется к строке, что бы потом сделать сортировку. Строка хранит номер файла, а объект хранит уровень приоритета. С помощью метода TStringList.CustomSort(CompareObjVal);  и функции CompareObjVal сортируются номера файлов. После чего файлы обрабатываются в отсортированном виде.

Код

Function CompareObjVal(List: TStringList; Index1, Index2: Integer):Integer;
  Begin
    Result:=Integer(List.Objects[Index2])-Integer(List.Objects[Index1]);
  End;


Может быть есть возможность реализовать данный алгоритм по другому - без использования TStringList и AddObjects. 
PM MAIL   Вверх
Romikgy
Дата 18.7.2006, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 26
Всего: 146



Цитата(Siton @  18.7.2006,  11:46 Найти цитируемый пост)
Строка хранит номер файла, а объект хранит уровень приоритета.

где это хранится? 


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Alexeis
Дата 18.7.2006, 13:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Цитата(Siton @  18.7.2006,  12:46 Найти цитируемый пост)
Result:=Integer(List.Objects[Index2])-Integer(List.Objects[Index1]);
 - что должна была делать эта операция?

Добавлено @ 13:01 
Вычитание адресов объектов это круто! 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Siton
Дата 18.7.2006, 13:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 17.7.2006

Репутация: нет
Всего: нет



Номер найденного файла хранится в slPr.Strings[i], а его приоритет обработки в slPr.Objects[i]. Зачем такая сортировка я еще неразобрался, но после сортировки меняется порядок  slPr.Strings[i] и соответственно порядок обработки файлов. Но проблема в очистке.

Добавлено @ 13:20 
Есть такое предположение что у одного из найденных файлов приоритет равен нулю и при добавлении к номеру этого файла объекта указывающего на ноль то происходит утечка. 
Код


...
iR=3;//для примера
iPr=0;//для примера
//iR- добавится как '3' А как добавится объект????
slPr.AddObject(IntToStr(iR),Pointer(iPr)); 
 
PM MAIL   Вверх
Alexeis
Дата 18.7.2006, 13:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Елки палки в адрес записали значение переменной, значит нет никакого объекта вообще! Вместо удаления - обращение к черт знает какому фрагменту памяти! Удалять ничего в этом случае не надо! smile

Добавлено @ 13:35 
Поэтому и вычитались адреса, поскольку это не адреса вовсе! А просто значения записанные вместо адресса в переменную типа Pointer 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Siton
Дата 18.7.2006, 14:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 17.7.2006

Репутация: нет
Всего: нет



Но потеря памяти остается. если закаментировать строку slPr.AddObject(IntToStr(iR),Pointer(iPr)); то утечка прекращается. Почему же тогда происходит утечка памяти 
PM MAIL   Вверх
Alexeis
Дата 18.7.2006, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Цитата(Siton @  18.7.2006,  14:01 Найти цитируемый пост)
Почему же тогда происходит утечка памяти 

Код

procedure TStringList.InsertItem(Index: Integer; const S: string; AObject: TObject);
begin
  Changing;
  if FCount = FCapacity then Grow;
  if Index < FCount then

 TStringList - это на самом деле не список а динамический масив
Код

if Index < FCount then
    System.Move(FList^[Index], FList^[Index + 1],
      (FCount - Index) * SizeOf(TStringItem));

, память , которого выделяется  "if FCount = FCapacity then Grow;"  порциями. Обычно, то что уже было выделено, не возвращается в кучу, поскольку велика вероятность повторного использования этого пространства.

Добавлено @ 16:52 
Вот как выглядит grow
Код

procedure TList.Grow;
var
  Delta: Integer;
begin
  if FCapacity > 64 then
    Delta := FCapacity div 4
  else
    if FCapacity > 8 then
      Delta := 16
    else
      Delta := 4;
  SetCapacity(FCapacity + Delta);
end;


Добавлено @ 16:54 
А при удалении память не возвращается (не fremem ни чего подобного не наблюдается)
Код

procedure TList.Delete(Index: Integer);
var
  Temp: Pointer;
begin
  if (Index < 0) or (Index >= FCount) then
    Error(@SListIndexError, Index);
  Temp := Items[Index];
  Dec(FCount);
  if Index < FCount then
    System.Move(FList^[Index + 1], FList^[Index],
      (FCount - Index) * SizeOf(Pointer));
  if Temp <> nil then
    Notify(Temp, lnDeleted);
end;


Добавлено @ 16:56 
Так,  что для освобождения памяти в вашем случае годится только 
slPr.free; 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Mechanic
Дата 19.7.2006, 09:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 228
Регистрация: 5.5.2006
Где: Kharkov, Ukraine

Репутация: 6
Всего: 7



Цитата(Romikgy @  18.7.2006,  11:35 Найти цитируемый пост)
Mechanic, из исходников 
....
куда объект в последней функции записыватся будет?????


Цитата(Siton @  17.7.2006,  16:59 Найти цитируемый пост)
Переменная slPr берется из другой процедуры где имеет тип TStringList

Ясно куда? smile

Цитата(Mechanic @  18.7.2006,  11:23 Найти цитируемый пост)
Создавать такой экземпляр не надо, но вот как тип параметра - почему же не использовать?

Тут что-ли? Так ясно, что реально работают виртуальные методы наследников. Просто ХЗ, что будет унаследовано и передано, лучше уж в функу пущай базовый класс передается, раз ничего, кроме его методов там не используется.

А арифметика в "адресах" Objects[] мне сразу не понравилась.. 
--------------------
Tell me the extensions of the files You backup and I'll tell You who You are..  ©Mch  
PM   Вверх
Alexeis
Дата 19.7.2006, 09:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Цитата(Mechanic @  19.7.2006,  09:39 Найти цитируемый пост)
Просто ХЗ, что будет унаследовано и передано, лучше уж в функу пущай базовый класс передается, раз ничего, кроме его методов там не используется.

И совсем не ХЗ - а будут вызываться одноименные функции, того класса, который был передан, правда только в том случае если в классе предка они определены были хотя бы абстрактно. 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Siton
Дата 19.7.2006, 17:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 17.7.2006

Репутация: нет
Всего: нет



Я решил вопрос с утечкой.  smile Проблема была не в TStringList - Memproff ошибся на пять сторчек. Бажная строка была ниже на пять строчек. smile 

Код

Procedure TRPLThread.Execute;
  Var
    FSR:TSearchRec;
    aFSR:TASearchRec;
    S:String;
    sstm:_Systemtime;
    lcftm: _filetime;
    I,J:Integer;
    ObrFilename:String;
    slO,slPr,slToDo:TStringList;
    OldT:String;
    dirdat_odname:String;
    FoundAnyFile:Boolean;
    Work_dat_Od:TDateTime;
    FilePathCo:String;
    tm:Integer;
    tt:ttypetime;
    ttKey:TTypeKey;
    slBadFiles:TStrings;
    bSkipFile:Boolean;
    sPrevFN:String;
    stmpFileMask:String;
    tMess:String;

  Begin
...

For I:=0 To slPr.Count-1 Do Begin
          J:=StrToInt(slPr[I]);
/////////////////////////////////
          FSR:=aFSR[J];// Вот эта строчка вызывала утечку
////////////////////////////////
          FileTimeToLocalFileTime(FSR.FindData.ftLastWriteTime,lcftm);
          FileTimeToSystemTime(lcftm,sstm);
          S:=Format('%.4d%.2d%.2d%.2d%.2d%.2d %.10d',[sstm.wYear,sstm.wMonth,sstm.wDay,
              sstm.wHour,sstm.wMinute,sstm.wSecond,FSR.Size]);
          OldT:=slO.Values[FSR.Name];
          If Copy(OldT,14+1,1)<>' ' Then
            OldT:=Format('%s %.10d',[OldT,FSR.Size]);
          bSkipFile:=False;
          If ((OldT='') Or (OldT<>S)) And (slBadFiles.IndexOf(FSR.Name)>=0) Then Begin
            WriteOutput(GetFullFileInfoToStr('Skipping File = ',FSR.Name,sstm,FSR.Size));
            bSkipFile:=True;
          End;
          If ((OldT='') Or (OldT<>S)) And (Not bSkipFile) Then Begin
            WriteOutput(GetFullFileInfoToStr('queue ',FSR.Name,sstm,FSR.Size)
              +IIFStr((OldT='') Or ((Length(OldT)=11) And (Copy(OldT,1,1)=' ')),' new',''));
            slToDo.Add(IntToStr(J));
          End;
        End;


Яубрал  эту строчку  FSR:=aFSR[J]; А везде где встречается 
FSR заменил на aFSR[J]. И утечка исчезла. smile 
Спасибо всем за советы. 
PM MAIL   Вверх
Mechanic
Дата 19.7.2006, 17:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 228
Регистрация: 5.5.2006
Где: Kharkov, Ukraine

Репутация: 6
Всего: 7



Цитата(alexeis1 @  19.7.2006,  09:45 Найти цитируемый пост)
И совсем не ХЗ - а будут вызываться одноименные функции, того класса, который был передан, правда только в том случае если в классе предка они определены были хотя бы абстрактно.

Имелось в виду, что неизвестно, что именно будет унаследовано от базового класса, и экземпляр какого именно типа будет передаваться на обработку. Вот поэтому всегда стараюсь принимать функами / процедурами минимально приемлемый класс. А с методами пущай уже сам экземпляр разбирается, зачем же ему VMT тогда? smile
Никому же не придет в голову писать, например, потоковый обработчик, на входе который получает TFileStream вместо TStream, если к файлам обработчик никакого отношения не имеет? 
--------------------
Tell me the extensions of the files You backup and I'll tell You who You are..  ©Mch  
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0585 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.