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

Поиск:

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


Новичок



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

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



Программа работает в круглосуточном режиме. 
Возникает утечка памяти при работе с компонентом TStrings при добавлении объекта к строке. Где то я вычитал что делфи сам не очищет объекты добавленные таким способом. При вызове метода TStrings.Clear - память не очищается, я проверял с помощью memproof и DMM. При добавлении кода 

Код

for I:=1 to slPr.Count-1 do begin
    slPr.Objects[I].Free;
    end;
 

возникает ошибка обращения к памяти. Помогите мне пожалуйста. Код программы чужой. 
Может быть нужно сделать переменную slPr - глобальной.

Привожу пример кода:
Код

Procedure FindAllFiles(Const sFN:String;
    Var aFSR:TASearchRec;slO,slPr:TStrings;
    Const aPrList:TaPriorityFile;Work_dat_Od:TDateTime;
    Const PathIn:String; Var tMess:String;
    Const aIgnList:TaIgnoreFile);
  Var
    FSR:TSearchRec;
    I,iA,iR,iPr,J,ipr1,nPos,iIgn:Integer;
    sFN_m:String;
    sDat_od:String[8];
    Filename,Filenew: String;
  Begin
    aFSR:=Nil;
    for I:=1 to slPr.Count-1 do begin
    slPr.Objects[I].Free; //--ошибка обращения к памяти
    end;
    slPr.Clear;
    FillChar(FSR,SizeOf(FSR),0);
    iA:=0;
    iR:=0;
    I:=FindFirst(sFN,0,FSR);
    Try
      If I=0 Then
        Repeat
          If iA<=iR Then Begin
            iA:=iR*2+1;
            SetLength(aFSR,iA);
          End;
          aFSR[iR]:=FSR;
          If slO.Values[FSR.Name]='' Then
            iPr:=100
          Else
            iPr:=0;
          ipr1:=0;
          For J:=Low(aPrList) To High(aPrList) Do Begin
            If IsMaskValid(FSR.Name,aPrList[J].sFileMask) Then
              If ipr1<aPrList[J].iLevel Then
                ipr1:=aPrList[J].iLevel;
          End;
          iPr:=iPr+ipr1;
          iIgn:=0;
          For J:=Low(aIgnList) To High(aIgnList) Do Begin
            If IsMaskValid(FSR.Name,aIgnList[J].sFileMask) Then
               iIgn:=1;
          End;
          if iIgn=0 Then
                 //Здесь происходит утечка 
            if Assigned(Pointer(iPr)) then slPr.AddObject(IntToStr(iR),Pointer(iPr));
          Inc(iR);
          I:= FindNext(FSR);
        Until I<>0;
    Finally
      SysUtils.FindClose(FSR);
    End;
    nPos:=Pos( '.', sFN );
    tMess:='';
    If UpperCase(Copy(sFN,nPos-4,3))='MPF' Then Begin
// ----------------
      sDat_od:=FormatDateTime('yyyymmdd',Work_dat_Od);
      SysUtils.FindClose(FSR);
      FillChar(FSR,SizeOf(FSR),0);
      iA:=0;
      sFN_m:=PathIn+'\'+'MP11F?'+Copy(sDat_od,5,2)+'.txt';
      I:=FindFirst(sFN_m,0,FSR);
      Try
        If I=0 Then
          Repeat
            Filename:=PathIn+'\'+FSR.Name;
            Filenew:=PathIn+'\'+'MPF'+Copy(FSR.Name,6,1)+
            Copy(sDat_od,5,4)+'.txt';
            If Not FileExists (Filenew) Then Begin
              If Not CopyFile(PChar(Filename),PChar(Filenew),False) Then
                tMess:=tMess+'!!! cant copy file '+ Filename
              Else Begin
                tMess:=tMess+'Copy file '+Filename+'->'+Filenew;
                If iA<=iR Then Begin
                  iA:=iR*2+1;
                  SetLength(aFSR,iA);
                End;
                FSR.Name:='MPF'+Copy(FSR.Name,6,1)+
                Copy(sDat_od,5,4)+'.txt';
                aFSR[iR]:=FSR;

                If slO.Values[FSR.Name]='' Then
                  iPr:=100
                Else
                  iPr:=0;
                ipr1:=0;
                For J:=Low(aPrList) To High(aPrList) Do Begin
                  If IsMaskValid(FSR.Name,aPrList[J].sFileMask) Then
                    If ipr1<aPrList[J].iLevel Then
                      ipr1:=aPrList[J].iLevel;
                End;
                iPr:=iPr+ipr1;
                 //Здесь происходит утечка 
                if Assigned(Pointer(iPr)) then slPr.AddObject(IntToStr(iR),Pointer(iPr));
              End;
            End;
            Inc(iR);
            I:= FindNext(FSR);
          Until I<>0;
      Finally
        SysUtils.FindClose(FSR);
      End;
    End;
// -----------------
    SetLength(aFSR,iR);
    (slPr As TStringList).CustomSort(CompareObjVal);
  End;
 
PM MAIL   Вверх
Alexeis
Дата 17.7.2006, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


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

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



Цитата(Siton @  17.7.2006,  16:19 Найти цитируемый пост)
Возникает утечка памяти при работе с компонентом TStrings 

Интересно как же вам удалось создать экземпляр класса TStrings, учитывая что он абстрактный. Если утечка и возникает, то только по вине наследника, TStrings, который не правельно работает с памятю. Сам же TStrings c ней непосредственно не работает. Ищите главного виновника, - кто скрывается под личиной TStrings - кто у нас сегодня самое слабое звено smile  smile  


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

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

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


Новичок



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

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



Переменная slPr берется из другой процедуры где имеет тип TStringList

Вот код :
Код

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

    I:=lsKeys.IndexOf(AnsiUpperCase(Fskey));
    If I<0 Then ttKey:=ttUnknown Else ttKey:=TTypeKey(Integer(lsKeys.Objects[I]));
    sPrevFN:='';


    FoundAnyFile:=True;
    If bScanDirection Then
      Work_dat_Od:=DateBegin
    Else
      Work_dat_Od:=Dat_Od;
    slO:=Nil;
    slPr:=Nil;// Переменная которая передается
    slToDo:=Nil;
    slBadFiles:=Nil;
    Try
      slO:=TStringList.Create;
      slPr:=TStringList.Create;
      slToDo:=TStringList.Create;
      slBadFiles:=TStringList.Create;
      While Not Terminated Do Begin
        If bAutoDate And (Date()>Dat_Od) Then Begin
          WriteOutput('Change date to '+DateToStr(Date()));
          Dat_Od:=Date();
        End;
        osi.CalcNextTime(tt,tm);
        WriteOutput('Whait for  '+TimeToStr(Now+tm/(1000*60*60*24)));
        If WaitForSingleObject(StopEvent,tm)=WAIT_OBJECT_0 Then Begin
          WriteOutput('I am stopped !!! ');
          Break;
        End;

//
        If DateBegin=0 Then Begin
          Work_dat_Od:=Dat_Od;
          slBadFiles.Clear;
        End
        Else
          If Not FoundAnyFile Then Begin
            If bScanDirection Then Begin
              Case Date_interval Of
                0:Work_dat_Od:=Work_dat_Od+1;
                1:Work_dat_Od:=IncMonth(Work_dat_Od,1);
                2:Work_dat_Od:=IncMonth(Work_dat_Od,3);
                3:Work_dat_Od:=IncMonth(Work_dat_Od,12);
              End;
              If Work_dat_Od>Dat_Od Then Begin
                Work_dat_Od:=DateBegin;
                sPrevFN:='';
              End;
            End Else Begin
              Case Date_interval Of
                0:Work_dat_Od:=Work_dat_Od-1;
                1:Work_dat_Od:=IncMonth(Work_dat_Od,-1);
                2:Work_dat_Od:=IncMonth(Work_dat_Od,-3);
                3:Work_dat_Od:=IncMonth(Work_dat_Od,-12);
              End;
              If Work_dat_Od<DateBegin Then Begin
                Work_dat_Od:=Dat_Od;
                sPrevFN:='';
              End;
            End;
            slBadFiles.Clear;
          End;



        LoadObrFile(slO,Work_dat_Od,ObrFilename);
//
        If Terminated Then Break;
        stmpFileMask:=FileMask;
        If bLoadByName And (sPrevFN<>'') Then
          Case ttKey Of
            ttCMP,ttCOMPS,ttNORM_MKPB,ttNORM_MKPB_BAL,ttMPF,ttMO_SCPF,ttSCPF_PI,ttRezerv_ND,ttRisk_KP,ttKRED_BAS,ttRKP_KRED_BAS,ttKRED_BAS_PI,ttMO..ttMO9,ttCYPR_MO,ttMJ_,ttMJ_PI,ttMJ_PA:
              stmpFileMask:=Copy(stmpFileMask,1,2)+Copy(sPrevFN,3,4)+Copy(stmpFileMask,7,Length(stmpFileMask)-6);
          End;
        MakeFileScanMaskByType(ttKey,Work_dat_Od,S,dirdat_odname,PathIn,stmpFileMask,Dat_OdInPathIn);
        FillChar(FSR,SizeOf(FSR),0);
        WriteOutput('сканируем '+S);
        FoundAnyFile:=False;
////////////////////////
/////-Здесь вызов процедуры из первого сообщения       
FindAllFiles(S,aFSR,slO,slPr,aPrList,Work_dat_Od,PathIn,tMess,aIgnList);
////////////////////////
        If tMess<>'' Then WriteOutput(tMess);
        slToDo.Clear;
        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;
        
        If slToDo.Count>0 Then Begin
          J:=StrToInt(slToDo[0]);
          FSR:=aFSR[J];
          OldT:=slO.Values[FSR.Name];
          FoundAnyFile:=True;
          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]);
          If (OldT='') Or ((Length(OldT)=11) And (Copy(OldT,1,1)=' ')) Then Begin
            WriteOutput(GetFullFileInfoToStr('Найден новый файл ',FSR.Name,sstm,FSR.Size));
            bPovtor:=False;
          End
          Else Begin
            WriteOutput('!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!');
            WriteOutput(GetFullFileInfoToStr('Повтор файла ',FSR.Name,sstm,FSR.Size));
            WriteOutput('!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!');
            bPovtor:=True;
          End;
          
          If ttKey<>ttfiktiv Then Begin
            If Not CopyFileRO(FSR.Name,dirdat_odname,FilePathCo,FSR.Size) Then Continue;
          End;
          
//
          
          Case ttKey Of
            ttSCPF_PI: ProcessSCPF_PIFile(FilePathCo,Work_dat_Od);
            ttRezerv_ND: ProcessRezerv_NDFile(FilePathCo,Work_dat_Od);
            ttRisk_KP: ProcessRisk_KPFile(FilePathCo,Work_dat_Od);
            ttMO_SCPF: ProcessMO_SCPFFile(FilePathCo,Work_dat_Od);
            ttCMP: ProcessCMPFile(FilePathCo,Work_dat_Od);
            ttCOMPS: ProcessCOMPSFile(FilePathCo,Work_dat_Od);
            ttNORM_MKPB: ProcessNORM_MKPBFile(FilePathCo,Work_dat_Od);
            ttNORM_MKPB_BAL: ProcessNORM_MKPB_BALFile(FilePathCo,Work_dat_Od);
            ttMPF: ProcessMPFFile(FilePathCo, Work_dat_Od);
            ttKRED_BAS: ProcessKRED_BASFile(FilePathCo,Work_dat_Od);
            ttRKP_KRED_BAS: ProcessRKP_KRED_BASFile(FilePathCo,Work_dat_Od);
            ttKRED_BAS_PI: ProcessKRED_BAS_PIFile(FilePathCo,Work_dat_Od);
            ttMO..ttMO9,ttCYPR_MO: ProcessMOFile(FilePathCo,Work_dat_Od, Ord(ttKey)-Ord(ttMO)+1);
            ttSCPF_V2:ProcessScpf_v2File(FilePathCo,Work_dat_Od);
            ttGKF_: ProcessGKFile(FilePathCo,Work_dat_Od,'f',False);
            ttMB_: ProcessMBFile(FilePathCo,Work_dat_Od);
            ttMB_optirisk: ProcessMBFile(FilePathCo,Work_dat_Od);
            ttMBMB_1,ttMBMB_2: ProcessMBMBFile(FilePathCo,Work_dat_Od);
            ttMBMB_MP: ProcessMBMB_MPFile(FilePathCo,Work_dat_Od);
            ttMBMB_SCR: ProcessMBMBSCRFile(FilePathCo,Work_dat_Od);
            ttVZ01: ProcessVZ01File(FilePathCo,Work_dat_Od);
            ttvip_: ProcessSCPF_VIPFile(FilePathCo,Work_dat_Od);
            ttGKO_: ProcessGKFile(FilePathCo,Work_dat_Od,'o',False);
            ttGKM_: ProcessGKFile(FilePathCo,Work_dat_Od,'M',False);
            ttGKV_: ProcessGKFile(FilePathCo,Work_dat_Od,'V',False);
            ttGKG_: ProcessGKFile(FilePathCo,Work_dat_Od,'G',False);
            ttGKp_: ProcessGKFile(FilePathCo,Work_dat_Od,'p',False);
            ttGK_: ProcessGKFile(FilePathCo,Work_dat_Od,'',False);
            ttGZ_: ProcessGKFile(FilePathCo,Work_dat_Od,'',True);
            ttGZF_: ProcessGKFile(FilePathCo,Work_dat_Od,'f',True);
            ttGZO_: ProcessGKFile(FilePathCo,Work_dat_Od,'o',True);
            ttMJ_: ProcessMJFile(FilePathCo,Work_dat_Od);
            ttMJ_PI: ProcessMJFile(FilePathCo,Work_dat_Od);
            ttMJ_PA: ProcessMJFile(FilePathCo,Work_dat_Od);
            ttNBU01_: ProcessNbu01File(FilePathCo,Work_dat_Od);
            ttFS:ProcessFS(FilePathCo,Work_dat_Od);
            ttKP01_: ProcessNbu01_OtherFile(FilePathCo,'KP','03',Work_dat_Od);
            tt01_FO_03: ProcessNbu01_OtherFile(FilePathCo,'***','03',Work_dat_Od);
            tt01_FO_08: ProcessNbu01_OtherFile(FilePathCo,'***','08',Work_dat_Od);
            tt02_FO_08: ProcessNbu02_OtherFile(FilePathCo,Copy(FSR.Name,4,3),'08',Work_dat_Od);
            ttPI01_: ProcessNbu01_OtherFile(FilePathCo,'ПИ','08',Work_dat_Od);
            ttNBU26_: ProcessNbu26File(FilePathCo,Work_dat_Od);
            ttNBU26_DBF: ProcessNbu26FileDBF(FilePathCo,Work_dat_Od);
            ttNBUA7_: ProcessNbuA7File(FilePathCo,Work_dat_Od);
            ttNBUA7_DBF,ttNBUA7_CY_DBF: ProcessNbuA7File_DBF(FilePathCo,Work_dat_Od,ttKey=ttNBUA7_CY_DBF);
            ttFDPGR: ProcessFDPGRFile(FilePathCo,Work_dat_Od);
            ttfiktiv: DeleteFile(FilePathCo);
            ttCYBB_: ProcessCyBBFile(FilePathCo,Work_dat_Od);
            ttSams,ttSams_mkpb:ProcessSamsFile(FilePathCo,Work_dat_Od,OldT);
            ttZalog:ProcessZalogFile(FilePathCo,Work_dat_Od);
            ttLikvP48dp,ttEffP48dp:ProcessLikvP48dpFile(FilePathCo,Work_dat_Od);
            ttCySD:ProcessCySDFile(FilePathCo,Work_dat_Od);
            ttZals:ProcessZalsFile(FilePathCo,Work_dat_Od);
            ttNBU84_:ProcessNbu84File(FilePathCo,Work_dat_Od);
            ttNBUC5_:ProcessNbuC5File(FilePathCo,Work_dat_Od);
            ttPari:ProcessPariFile(FilePathCo,Work_dat_Od);
            ttPari_o:ProcessParioFile(FilePathCo,Work_dat_Od);
            ttRaru:ProcessRaruFile(FilePathCo,Work_dat_Od);
            ttPrim: ProcessPrimeFile(FilePathCo,Work_dat_Od);
            Else WriteOutput(Format('unknown type of key =%s [%s]',[Fskey,Integer(ttKey)]));
          End;
          
          
          If FileExists(FilePathCo) Then Begin
            slBadFiles.Add(FSR.Name);
            Continue;
          End;
          slO.Values[FSR.Name]:=S;
          SaveObrFile(slO,ObrFilename,FSR.Name,OldT,S);
          sPrevFN:=FSR.Name;
          If bLoadByName Then
            FoundAnyFile:=False;
//Break;
        End;
      End;
//   Until FindNext(FSR)<>0 ;
{
        Finally
          SysUtils.FindClose(FSR);
        End;
        }
//End;
    Finally
      slO.Free;
      slBadFiles.Free;
      slPr.Free;
      slToDo.Free;
    End;
  End;
 
PM MAIL   Вверх
Alexeis
Дата 17.7.2006, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


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

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



Цитата(Siton @  17.7.2006,  16:19 Найти цитируемый пост)
    for I:=1 to slPr.Count-1 do begin    slPr.Objects[I].Free; //--ошибка обращения к памяти    end;

Да но ведь StringList не содержит объектов, только строки, поэтому и пытается обратится к несуществующему объекту

Добавлено @ 17:48 
Ух ты я и не знал, что туда можно еще и объекты пихать, такое ощущение, что они не присваивались.

Добавлено @ 17:52 
Я проверил
Код

   r : TRegistry;
   l : TStringList;

begin
  l := TStringList.Create;
  r := TRegistry.Create;
  l.AddObject(' ', r);
  l.Objects[0].Free;
  l.Clear;
  l.Free;


Все работает нормально! просто один из объектов не существует уже.  


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

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

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


Новичок



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

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



Попробуй все таки переименовать все TString на TStringList.

Сделай проверку

Код

for I:=1 to slPr.Count-1 do begin
  if Assigned(slPr.Objects[I]) then FslPr.Objects[I].Free;
end;


Посмотри как работает FreeAndNil:
Код

procedure FreeAndNil(var Obj);
var
  Temp: TObject;
begin
  Temp := TObject(Obj);
  Pointer(Obj) := nil;
  Temp.Free;
end;


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


Бывалый
*


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

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



Solve code for lines 14..17 of 2nd code in post #1 smile
Код

    for I:=0 to slPr.Count-1 do   //ZERO BASED!!!
    begin
      if Assigned(slPr.Objects[I]) then  //Some protection
          slPr.Objects[I].Free;
    end;
    slPr.Clear;


Добавлено @ 19:54 
Опа, уже повтор. Лапы не шибко быстро сгинаются. smile 
--------------------
Tell me the extensions of the files You backup and I'll tell You who You are..  ©Mch  
PM   Вверх
Akella
Дата 18.7.2006, 09:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

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



Цитата

Procedure FindAllFiles(Const sFN:String;
    Var aFSR:TASearchRec;slO,slPr:TStrings;


Никогда в коде программы не используйте TStrings, это абстрактный класс, нужно использовать TStringList! 
PM MAIL   Вверх
Siton
Дата 18.7.2006, 09:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Проверка (Assigned(slPr.Objects[i])) не помогает, все равно ошибка обращения. При использовании FreeAndNil компилятор пишет Constant object cannot be passed as var parameter. В чем ошибка. 
PM MAIL   Вверх
Alexeis
Дата 18.7.2006, 10:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


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

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



А если так
Код

var
 o : TObject;
..........
Begin
...............
o := slPr.Objects[i];
FreeAndNil(o);
 


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

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

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


Новичок



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

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



Ошибка обращения (AV) на строке o := slPr.Objects[i];
 
PM MAIL   Вверх
Alexeis
Дата 18.7.2006, 10:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


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

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



Siton, У вас проблемы не с освобождением, а с самим объектом - где-то раньше. 
Я проверял почти весь код который приводился (из того что компилировался) работает. Вероятно имеюстся проблемы с объектами - напимер если использовались потоки, или в результате ошибки портится содержимое объекта. Похоже, что при вызове деструктора объекта возникает ошибка. 


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

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

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


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


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

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



Согласен с 
Akella, используй строку описания функции
Код

Procedure FindAllFiles(Const sFN:String;    
    Var aFSR:TASearchRec;slO,slPr:TStringList;    
    Const aPrList:TaPriorityFile;Work_dat_Od:TDateTime;    
    Const PathIn:String; Var tMess:String;    
    Const aIgnList:TaIgnoreFile);

Если ошибок в другом месте нет , значит код запустится сразу smile 


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

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


Бывалый
*


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

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



Цитата(Akella @  18.7.2006,  09:03 Найти цитируемый пост)
Никогда в коде программы не используйте TStrings, это абстрактный класс, нужно использовать TStringList!

Создавать такой экземпляр не надо, но вот как тип параметра - почему же не использовать? Мало-ли что понанаследуется, а строки есть строки.


Цитата(Siton @  17.7.2006,  16:19 Найти цитируемый пост)

Код

                iPr:=iPr+ipr1;   //Что здесь? Адрес + 100?
                 //Здесь происходит утечка 
                if Assigned(Pointer(iPr)) then slPr.AddObject(IntToStr(iR),Pointer(iPr));


Вот здесь идет адресная арифметика, а результат идет в объектный указатель. Может быть тут и пишется неверный указатель? 
--------------------
Tell me the extensions of the files You backup and I'll tell You who You are..  ©Mch  
PM   Вверх
Romikgy
Дата 18.7.2006, 11:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Mechanic, из исходников 
Код


TStrings = class(TPersistent)
...
function AddObject(const S: string; AObject: TObject): Integer; [B]virtual;[/B]
...

function TStrings.AddObject(const S: string; AObject: TObject): Integer;
begin
  Result := Add(S);
  PutObject(Result, AObject);
end;

procedure TStrings.PutObject(Index: Integer; AObject: TObject);
begin
end;

куда объект в последней функции записыватся будет????? 


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

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


Новичок



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

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



Переменная slPr обявляется не глобально. Может быть ее обявить как глобальную?
И еще, можноли передать в функцию не переменную а указатель?
 
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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