|
|
1
14
此错误看起来像是在使用FastMM进行内存管理。
这意味着您使用的接口引用的对象已经被释放。
为了更改这些,并进行调试,您不能使用Delphi附带的stock FastMM。
下载后:
就像
gabr
已经提到了,里面
完成这些设置后, 通过调试器使用FastMM运行应用程序,并在FastMM4单元内的此方法上放置断点:
我已经修改了我的FastMM4单元一点,以获得更多的上下文信息;我可以和你分享(我已经把它寄给了FastMM4团队,但是还没有包含在官方资料中)。
我写了一篇很密集的文章
blog article on debugging using FastMM
--杰罗恩 编辑 |
|
|
3
6
查找问题的步骤:
我也遇到过这些问题,上面的方法帮我找到了。我的问题是由实现接口的TComponents引起的。假设您有ComponentA和ComponentB,ComponentB实现了一个接口。将ComponentB(或其接口)分配给ComponentA并存储接口引用。现在ComponentB被销毁了,但是ComponentA不知道。当您销毁ComponentA时,它会关闭接口,调用\u Release方法并获得AV。 解决方法是使用TComponent.FreeNotification。当您收到来自ComponentB的免费通知时,您将禁用ComponentA中的接口。我不知道你的代码,但如果你的问题是类似的,你也可以与免费通知。 编辑: |
|
4
3
一个类似的错误,咬了我是一个接口引用已经设置了一个现有的对象,接口引用计数器不会自动减少时,所有者对象被释放。这可以用一个简单的方法来解决
|
|
|
5
3
我做了一个类似的事情,下面的代码在你的对象的析构函数中将有所帮助
您可以做的另一件事是在addref和release方法中放置断点,并跟踪谁在保留接口引用,以及这些对象是否在之后释放它们。 还有一个常见的问题是,如果您获得一个接口并用相同的方法释放对象
|
|
|
6
2
要在代码中查找的一件事是
范围与
其中FInterfacedObject是一个类变量。 如果愿意,可以从内部函数调用GetInterface,但是如果在创建FInterfacedObject的同一范围内调用GetInterface,无论出于何种原因,都会将引用计数降至0并释放该对象,但它不会为零,因此如果这样做
你会被侵犯访问权限。 |