I have a data module which I can not free (funny as it might sound). Whether I try to destroy it manually, or let another component (even Application) do it for me, I get an AV with this stack trace:
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
This data module contains a bunch of TADOxxx components, plus two TJvDataSource, one TApplicationEvents, one TClientDataSet, and one TJvAppDBStorage. Its code contains nothing more than opening the ADO connection, writing a few records to a table, running a few queries, etc. (nothing unusual). It doesn't own any other components besides what I mentioned above. I'm puzzled as to where does this bogus call to RemoveNotificaion() originate from. Any ideas?
UPDATE
After removing the TJvAppDBStorage, I can destroy the data module. Here's the component's properties:
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
Has anyone ever used JvAppDBStorage? Is this its normal and expected behavior?
I've no experience with JvAppDBStorage but I can make a guess as to what is happening.
This component stores settings to a database, as specified by the DataSource property of the JvAppDBStorage instance. In your case that is dsConfiguration. So, for this all to work you need for dsConfiguration to be available whenever AppStorage reads and writes settings. I'll bet that dsConfiguration has already been destroyed when AppStorage attempts to store to it. I expect that happens when AppStorage is freed. So the explanation for the problem is that dsConfiguration is freed before AppStorage.
The solution will be to make sure that dsConfiguration is still alive when AppStorage is freed.