【发布时间】:2011-03-05 12:46:35
【问题描述】:
我一定错过了一些相当容易的事情吗?我正在尝试在 Delphi 3 应用程序中创建一个链表。
这是通过 ItemList 和 Item 两个类实现的。 ItemList 在表单创建时被实例化。它在表单的生命周期内持续存在。每个 Item 对象都根据需要进行实例化。该表单有一个名为AddAcc 的函数。 AddAcc 通过表单控件之一的 on-change 事件调用。
在这个 on-change 事件期间会发生什么:
- 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;
非常感谢任何帮助。
【问题讨论】:
-
请给我们一些代码。看到您的代码后,我们会告诉您其中有什么问题。
-
请贴出调用 AddAcc 的代码、AddAcc 方法本身、声明 ListItem 对象的代码行以及初始化它的代码行。基本上,声明、初始化、AddAcc + 至少一个调用 AddAcc 的地方(以及调用它的方法中的所有代码,而不仅仅是调用它的代码行)
-
我猜你正在传递一个包含指针的局部变量的地址。
-
@David 听起来确实如此。
-
你能发布真正的代码吗,这甚至不是帕斯卡。函数有返回值。您能否包括
Item和ptrItem的类型定义。
标签: delphi memory-management linked-list