插入到sqlite db时发生错误时Delphi XE3中的内存泄漏

前端之家收集整理的这篇文章主要介绍了插入到sqlite db时发生错误时Delphi XE3中的内存泄漏前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
...
Query: TsqlQuery
...
    Query.sql.Clear;
    Query.sql.Add('INSERT INTO pumps'#13#10 +
                       'VALUES (NULL,:title,:power)');
    Query.ParamByName('title').AsString:= title;
    Query.ParamByName('power').AsFloat:= power;
    try
      Query.Execsql;
    except
      on E: Exception do
        begin
          ShowMessage(E.Message);
        end;
    end;

查询通过driver = sqlite链接sqlConnection.所有操作都可以正常工作,但是当我尝试将非唯一值插入到具有唯一索引的列中时,我会得到有关值存在的异常.好的,我的代码捕获它并显示消息’列标题不唯一’,但在调试器显示异常TWICE之前.当我关闭程序时,内存管理器会告诉内存泄漏,泄漏是:

> 21 – 28字节:UnicodeString x 4
> 61 – 68字节:TDBXsqliteCommand x2
> 69 – 76字节:TDBXMorphicCommand x 2
> 221 – 236字节:未知x 2

有可能避免这种情况吗?

UPD:我使用FastMM4来获取详细的日志,下面是关于一个内存泄漏的部分:

A memory block has been leaked. The size is: 68

This block was allocated by thread 0xB18,and the stack trace (return addresses) at the time was:
4068A6 [System.pas][System][@GetMem$qqri][4203]
4082BB [System.pas][System][TObject.NewInstance$qqrv][14969]
4089D2 [System.pas][System][@ClassCreate$qqrpvzc][16231]
7D5A91 [Data.Dbxsqlite.pas][Data.Dbxsqlite][Dbxsqlite.TDBXsqliteCommand.$bctr$qqrp26Data.Dbxcommon.TDBXContextp35Data.Dbxsqlite.TDBXsqliteConnection][567]
6E3DFE [Data.DBXCommon][Generics.Collections.%TDictionary__2$20System.UnicodeStringp32Data.Dbxcommon.TDBXCreateCommand%.GetBucketIndex$qqrx20System.UnicodeStringi]
7D4C8E [Data.Dbxsqlite.pas][Data.Dbxsqlite][Dbxsqlite.TDBXsqliteDriver.CreatesqliteCommand$qqrp26Data.Dbxcommon.TDBXContextp29Data.Dbxcommon.TDBXConnectionp26Data.Dbxcommon.TDBXCommand][295]
6CE4DA [Data.DBXCommon.pas][Data.DBXCommon][Dbxcommon.TDBXDriver.CreateMorphCommand$qqrp26Data.Dbxcommon.TDBXContextp29Data.Dbxcommon.TDBXConnectionp26Data.Dbxcommon.TDBXCommand][7569]
6D5177 [Data.DBXCommon.pas][Data.DBXCommon][Dbxcommon.TDBXDelegateDriver.CreateMorphCommand$qqrp26Data.Dbxcommon.TDBXContextp29Data.Dbxcommon.TDBXConnectionp26Data.Dbxcommon.TDBXCommand][11061]
6D09F4 [Data.DBXCommon.pas][Data.DBXCommon][Dbxcommon.TDBXConnection.CreateMorphCommand$qqrp26Data.Dbxcommon.TDBXCommand][8480]
6D1C21 [Data.DBXCommon.pas][Data.DBXCommon][Dbxcommon.TDBXMorphicCommand.DerivedOpen$qqrv][9084]
6D1974 [Data.DBXCommon.pas][Data.DBXCommon][Dbxcommon.TDBXCommand.Open$qqrv][8962]

The block is currently used for an object of class: TDBXsqliteCommand
我使用dbXpress sqlite和MysqL驱动程序(XE3)运行测试,你的代码只是泄漏了sqlite(在调试模式下也得到了双重异常),但它不适用于MysqL.

恕我直言这是一个应该向QC报告的错误.

在调试器中首次发生异常时堆栈跟踪

:769cc41f KERNELBASE.RaiseException + 0x58
Data.DBXCommon.TDBXContext.Error(???,'column title is not unique')
Data.Dbxsqlite.CheckError(19,???,$2F12738)
Data.Dbxsqlite.TDBXsqliteCommand.DerivedExecuteQuery
Data.DBXCommon.TDBXCommand.ExecuteQuery
Data.DBXCommon.TDBXMorphicCommand.ExecuteQuery
Data.sqlExpr.TCustomsqlDataSet.ExecuteStatement
Data.sqlExpr.TCustomsqlDataSet.Execsql(???)
Data.sqlExpr.TsqlQuery.Execsql(???)
Main_ViewU.TForm1.RunQuery($2E7B870,'Title',10)
Main_ViewU.TForm1.Button1Click($2E85AD0)

在调试器中发生第二次异常时堆栈跟踪

:769cc41f KERNELBASE.RaiseException + 0x58    // <-- Exception interrupts Destroy
Data.DBXCommon.TDBXContext.Error(???,$2F12738)
Data.Dbxsqlite.TDBXsqliteCommand.DerivedClose
Data.DBXCommon.TDBXCommand.Close
Data.DBXCommon.TDBXMorphicCommand.DerivedClose
Data.DBXCommon.TDBXCommand.Close
Data.DBXCommon.TDBXCommand.Destroy            // <-- DESTROY
Data.DBXCommon.TDBXMorphicCommand.Destroy     // <-- DESTROY
System.TObject.Free
Data.sqlExpr.TCustomsqlDataSet.CloseStatement
Data.sqlExpr.TCustomsqlDataSet.InternalFreeCommand
Data.sqlExpr.TCustomsqlDataSet.FreeCommand
Data.sqlExpr.TCustomsqlDataSet.Execsql(???)
Data.sqlExpr.TsqlQuery.Execsql(???)
Main_ViewU.TForm1.RunQuery($2E7B870,10)
Main_ViewU.TForm1.Button1Click($2E85AD0)

这会导致内存泄漏……

猜你在找的Sqlite相关文章