您的位置:首页 > 其它

CCommand的资源管理方式

2010-04-08 00:14 323 查看
最近通过对ATL OLE DB源代码的进一步阅读,在验证了一些猜想的同时也发现了之前对CCommand资源管理方式的某些错误认识。这些认识上的错误可能隐式或显示地反映在了之前的相关博文中。为什么我会产生错误的认识呢?原因是我低估了CCommand的封装程度-_-!!!现将发现总结如下:

1、若CCommand使用CAccessor,则在绑定返回结果时(调用Bind方法)会首先调用memset将接收缓冲区清0。这说明什么了问题呢?举例来说,假设你传递给CAccessor的模板参数为CRecord类。CRecord有个char *p属性。然后你在CRecord的构造函数中动态分配空间给p,企图用它来接收一个字符串。这样做是有问题的,因为p在取得数据前就被memest成0了。

2、Close和ReleaseCommand方法是很健壮的,即使资源已经释放,再次调用也没有问题,方法会直接返回。

3、CCommand的析构函数会依次调用Close和ReleaseCommand。但如果你依赖于析构函数来释放资源,那么请确保在对象析构前没有执行CoUninitialize,否则Runtime Error(所以还是手动释放好些)。

4、调用带SQL命令参数的Open时会自动调用ReleaseCommand。所以除了在最后一次Open后可能需要手动调用ReleaseCommand外无须手动调用。

5、忘掉FreeRecordMemory吧~每次使用CCommand的MoveNext等函数时都会自动调用FreeRecordMemory。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: