我有一个无法释放的数据模块(听起来很有趣)。无论我是尝试手动销毁它,还是让另一个组件(甚至Application
)为我完成它,我都会得到一个带有此堆栈跟踪的 AV:
exception class : EAccessViolation
exception message : Access violation at address 0048FC2B in module 'Instruments.exe'. Read of address 80808088.
main thread ($1e28):
0048fc2b Instruments.exe System.Classes TComponent.RemoveNotification
00408a01 Instruments.exe System 57 @Halt0
00ac86f0 Instruments.exe Instruments 82 initialization
这个数据模块包含一堆TADOxxx
组件,加上两个TJvDataSource
、一个TApplicationEvents
、一个TClientDataSet
和一个TJvAppDBStorage
。它的代码只包含打开 ADO 连接、向表中写入一些记录、运行一些查询等(没有什么不寻常的)。除了我上面提到的之外,它不拥有任何其他组件。我很困惑这个虚假的电话是从哪里来RemoveNotificaion()
的。有任何想法吗?
更新
删除后TJvAppDBStorage
,我可以销毁数据模块。这是组件的属性:
object AppStorage: TJvAppDBStorage
StorageOptions.BooleanStringTrueValues = 'TRUE, YES, Y'
StorageOptions.BooleanStringFalseValues = 'FALSE, NO, N'
DataSource = dsConfiguration
KeyField = 'Key'
SectionField = 'Section'
SubStorages = <>
ValueField = 'Value'
Left = 272
Top = 304
end
有人用过JvAppDBStorage
吗?这是正常和预期的行为吗?