Конференция "Основная" » Выделение и освобождение памяти [D7]
 
  • Цукор5 (17.02.17 14:43) [0]

    type
     TOneDept = packed record
       DeptId : Integer;
       DeptName : ShortString;
     end;

     TDeptArray = array [0..0] of TOneDept;

     TDept = record
       Status : TStatusRec;
       Count  : Integer;
       Datas  : ^TDeptArray;
     end;

    function GetDept (var R:TDept):BOOL;
    function GetDeptFree (var R:TDept):BOOL;

    function AllocBlock(Size: Integer): Pointer;
    begin
     GetMem(Result, Size);
    end;

    function GetDept (var R:TDept):BOOL;
     var S:String; I:Integer;
     js:TlkJSONobject;
     jsList:TlkJSONlist;
     A: array of TOneDept;
    begin
     ...
     js := TlkJSON.ParseText(S) as TlkJSONobject;
     try
       jsList:= js.Field['table'] as TlkJSONlist;
       if Assigned(jsList) then
       begin
         SetLength(A , jsList.Count);
         for I:=Low(A) to High(A) do
         begin
           A[I].DeptId:=(jsList.Child[i] as TlkJSONobject).getInt('Int1');
           A[I].DeptName := (jsList.Child[i] as TlkJSONobject).getString('Str1');
         end;
         R.Count:=Length(A);
          R.Datas:=AllocBlock(SizeOf(TOneDept) * R.Count);
         R.Datas:=@A[0];
       end;
     finally
       js.Free;
     end;
     ...

    end;

    procedure FreeBlock(P: Pointer);
    begin
     FreeMem(P);
    end;

    function GetDeptFree (var R:TDept):BOOL;
    begin
     FreeBlock(R.Datas);
    end;

    procedure TForm1.Button9Click(Sender: TObject);
     var R:TDept;  I:Integer;
    begin
     if GetDept(R) then
     begin
       for I:=0 to R.Count-1 do
       begin
         Memo1.Lines.Add(Format('Dept Id: %d Name: %s',[R.Datas[I].DeptId, R.Datas[I].DeptName]));
       end;
     end;
     GetDeptFree(R);
    end;



    Что я делаю не так и понять не могу что.
    Без выделения и освобождения тоже не работает, т.к. массив успевает разрушиться. Работает, когда выделил, но не освободил, но это не правильно, т.к. утечка.
  • Давно не заходил (17.02.17 15:22) [1]
    Тяжелое наследство ТурбоПаскаля. Почему бы не сделать полем записи TDept динамический массив? Если же оставлять так как есть, то заменить
    > R.Datas:=@A[0]
    на
    Move (A[0], R.Datas^, SizeOf(TOneDept) * R.Count)
  • Цукор5 (17.02.17 16:06) [2]
    Спасибо
  • Dimka Maslov © (18.02.17 11:34) [3]

    > Почему бы не сделать полем записи TDept динамический массив?


    А ещё лучше список объектов
 
Конференция "Основная" » Выделение и освобождение памяти [D7]
Есть новые Нет новых   [118240   +20][b:0][p:0.002]