当前位置 : 主页 > 编程语言 > delphi >

Delphi 3内存分配问题

来源:互联网 收集:自由互联 发布时间:2021-06-23
我一定很想丢东西吗?我正在尝试在Delphi 3应用程序中创建链接列表. 这是通过两个ItemList和Item实现的. ItemList在表单创建时实例化.它持续到形式的生命.每个Item对象都根据需要进行实例
我一定很想丢东西吗?我正在尝试在Delphi 3应用程序中创建链接列表.

这是通过两个ItemList和Item实现的. ItemList在表单创建时实例化.它持续到形式的生命.每个Item对象都根据需要进行实例化.该表单有一个名为AddAcc的函数.通过其中一个窗体控件的on-change事件调用AddAcc.

在此次变更事件中会发生什么:

>调用AddAcc
> AddAcc创建一个新的Item对象
> AccAdd调用ItemList.AddItem并通过引用传递Item
> AddItem将Item对象放在列表的尾部

我测试过AddItem,效果很好.我的问题是每次调用* AddAcc *它都会获得相同的内存位置.我尝试了不同的方法来创建一个新的Item对象.我使用了New,GetMem(w / FillChar),并实例化了Item类型的局部变量.对AddAcc的所有调用都会导致获得相同的内存位置.

我直接(通过引用)将Item对象传递给AddItem,并且还传递了一个指向Item对象的指针.

我认为链接列表中Item对象实例的引用(指针)将确保维护Item的内存位置.但是,一旦退出AddAcc类,它就会被收集.

FUNCTION AddAcc;

Var

     accItem : ptrItem;

BEGIN

    GetMem(accItem, sizeOf(Item));

    FillChar(accItem^, sizeof(Item), 0);

    ItemList.AddItem(accItem^);

End;



Procedure TItemList.AddItem(Var newItem : TAccessoryItem);

begin
   Inc(_count);

   // add first item to the list            
    If (_count = 1) Then 
    begin       

          _fifoHead := @newItem;
          _tail := @newItem;
          newItem.Next   := @_tail;
          newItem.Previous := @_fifoHead;
          exit;

    end;

     _tail^.Next := @newItem;  
     newItem.Previous := _tail^;
     mewItem.Next := @_tail;
     _tail := @newItem;         
end;

任何帮助是极大的赞赏.

这是我写一个链表的方法:

type
  PItem = ^TItem;
  TItem = record
    Next: PItem;
    Data: Integer;
  end;

procedure Add(var First: PItem; Data: Integer);
var
  NewItem: PItem;
begin
  New(NewItem);
  NewItem.Next := First;
  NewItem.Data := Data;
  First := NewItem;
end;

...

var
  First: PItem;
begin
  First := nil;
  Add(First, 42);
  //etc.
end;

当您需要取消分配列表时,请执行以下操作:

var
  Item: PItem;
begin
  while Assigned(First) do begin
    Item := First;
    First := Item.Next;
    Dispose(Item);
  end;
end;

我相信这是在Pascal中编写链表类型代码的规范方式.

我故意为可以想象的这个最简单的链表编写这段代码.这使您可以专注于分配,使用指针等.您似乎已经知道如何在更复杂的列表中维护引用,因此我相信您可以轻松地根据您的需要调整这种代码.

网友评论