Delphi: TObjectList 在调用 Delete() 后不会释放对象
Delphi: TObjectList won't free object after Delete() is called
我有一个 TObjectList<TUSBDevice>
,其中 TUSBDevice
是我制作的 class。我尝试调用 Delete
并将索引作为参数传递,但它只是做了 TList.Delete()
所做的事情:从列表中删除指针但不释放对象本身。
我在 TUSBDevice.Destroy()
上设置的断点在调用 Delete()
时不会中断。我还查看了 TObjectList
,我可以看到该项目已从列表中删除,但对象内存地址处的内容未被释放。
TUSBDevice
的析构函数:
destructor TUSBDevice.Destroy();
begin
removeDatabaseEntry();
filteredFolders.Free();
fileQueue.Free();
end;
无法回答您的问题,因为它不包含最小的可重现示例;问题不在于您发布的代码,而在于其他地方。
不过,"overridden" 析构函数不是 运行 的最常见原因是它实际上没有被覆盖。所以我几乎可以打赌你的 Destroy
声明缺少 override
:
TUSBDevice = class
// ...
public
// ...
destructor Destroy; override;
// ...
end;
我有一个 TObjectList<TUSBDevice>
,其中 TUSBDevice
是我制作的 class。我尝试调用 Delete
并将索引作为参数传递,但它只是做了 TList.Delete()
所做的事情:从列表中删除指针但不释放对象本身。
我在 TUSBDevice.Destroy()
上设置的断点在调用 Delete()
时不会中断。我还查看了 TObjectList
,我可以看到该项目已从列表中删除,但对象内存地址处的内容未被释放。
TUSBDevice
的析构函数:
destructor TUSBDevice.Destroy();
begin
removeDatabaseEntry();
filteredFolders.Free();
fileQueue.Free();
end;
无法回答您的问题,因为它不包含最小的可重现示例;问题不在于您发布的代码,而在于其他地方。
不过,"overridden" 析构函数不是 运行 的最常见原因是它实际上没有被覆盖。所以我几乎可以打赌你的 Destroy
声明缺少 override
:
TUSBDevice = class
// ...
public
// ...
destructor Destroy; override;
// ...
end;