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。
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。
相关文章推荐
- 用类加载器的方式管理资源和配置文件
- J2EE常用资源管理方式总结
- 黑马程序员--用类加载器的方式管理资源和配置文件
- 黑马程序员_学习笔记8用类加载器的方式管理资源和配置文件及类加载器的总结
- 黑马程序员---用类加载器的方式管理资源和配置文件
- J2EE常用资源管理方式总结
- ESXi主机管理内存资源的方式
- Java IO流 用类加载器的方式管理资源和配置文件
- J2EE常用资源管理方式总结
- 反射应用之用类加载器的方式管理资源和配置文件
- Rails的静态资源管理(六)—— Asset Pipeline缓存存储方式、预处理、升级等
- 通过web方式来管理网站的资源
- J2EE常用资源管理方式总结
- 28 用类加载器的方式管理资源和配置文件
- 用类加载器的方式管理资源和配置文件
- 黑马程序员_用类加载器的方式管理资源和配置文件简单介绍
- 用类加载器的方式管理资源和配置文件
- C#专题二:教务管理系统中的另个一个登陆方式(另附资源链接)
- 用类加载器的方式管理资源和配置文件
- 用类加载器的方式管理资源和配置文件