CDynamicParameterAccessor避免内存泄漏的使用方法

      由于ATL OLE DB基于方便性和效率上的考虑,并未遵循“谁申请,谁释放”的内存管理原则[1],因此在使用过程中应特别小心,否则就可能出现内存泄漏。下面讨论CDynamicParameterAccessor的使用。对于该类的使用,稍有不慎就会导致内存泄漏。

      文章[2]中提到了CDynamicParameterAccessor的一种可能内存泄漏使用情形。对于该问题,除了可以按照文中所说的方法解决外,还可以通过在每次执行SQL后显式调用CDynamicParameterAccessor的析构函数予以解决,即使用类似如下的代码:

这里需要特别注意的是最后一次SQL执行后不应进行析构函数的显式调用,应留个系统自动隐式调用,否则会出现重复释放的错误。

      实际上,在CDynamicParameterAccessor的很多使用情况下都需要我们进行其析构函数的显示调用以避免内存泄漏。这个问题源于CDynamicParameterAccessor除了析构函数外在其它任何地方都不会自动释放动态分配的内存,而同时又有很多使用情形会导致内存的再次分配。由于再次分配时,之前已经分配的并未释放,所以导致内存泄漏。考虑如下示例代码:

这段看似没有问题的代码实际是会导致内存泄漏的。对Create的第二次调用会自动调用ReleaseCommand,此时m_hParameterAccessor被置0,而之前动态分配的内存未释放。接着调用BindParameters。BindParameters会检测到m_hParameterAccessor为0并重新分配内存,导致之前分配的内存泄漏。你可能会留意到BindParameters的dummy参数。从源代码分析以及MSDN文档来看,BindParameters通过这个参数返回指向参数缓冲区的指针。返回这个指针的目的是什么呢?是让我们注意需要自己对其进行释放吗?确实,在恰当的时候对dummy进行手动释放是一个正确的选择。但仅这样做只能减轻内存泄漏的程度,不能彻底解决问题。看看CDynamicParameterAccessor的析构函数就知道,动态分配的内存远不止dummy这一点。所以,较理想的解决方法应该是手动调用析构函数释放内存。这里再一次强调,最后一次析构调用应该始终留给系统来做,否则会出现重复释放的错误。

 

[1]:http://www.vckbase.com/document/viewdoc/?id=1493
[2]:http://www.codeproject.com/KB/database/ATLOLEDBMemLeak2.aspx

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值