具体问题如下:
我用MFC中单文档视图架构生成了一程序,在CMyWinApp类中声明了一 _ConnectionPtr变量m_MainConn,同时在 CMyWinApp类中的 InitInstance中,加了AfxOleInit()来初始化,以及 m_MainConn.CreateInstance(__uuidof(Connection))
程序编译运行没有问题,但是当关闭程序的时候,就发生异常,大致的意思是说:某指令引起的内存错误,该内存不能为"read".
当我把 m_MainConn.CreateInstance(__uuidof(Connection))这行代码去掉后,发现就没有刚才说的问题了。请问这是什么原因引起的?
我用MFC中单文档视图架构生成了一程序,在CMyWinApp类中声明了一 _ConnectionPtr变量m_MainConn,同时在 CMyWinApp类中的 InitInstance中,加了AfxOleInit()来初始化,以及 m_MainConn.CreateInstance(__uuidof(Connection))
程序编译运行没有问题,但是当关闭程序的时候,就发生异常,大致的意思是说:某指令引起的内存错误,该内存不能为"read".
当我把 m_MainConn.CreateInstance(__uuidof(Connection))这行代码去掉后,发现就没有刚才说的问题了。请问这是什么原因引起的?
解决方案 »
- 想问一下,在图形处理的时候有cliping region,还有clipin clipout是指的什么东西.
- 动态子类化一个现有控件出现错误
- 请教..郁闷啊!工作学VC.c有三年了.现在换了个公司,却让我学delphi.一点都没兴趣,星期一给答复!?
- 如何在MFC 开发的ActiveX Control工程中加载资源!急!
- 关于combox
- 关于实时数据采集及实时图形显示的问题 求助!
- 请问各位大峡哪里有比较好的vc和java的入门的电子书下载呀!!!
- 请问:如何限制编辑框输入文字的数量
- 我定义了一个数组,如何避免编译器将它作为CArray处理?
- 为什么我的ListCtrl不能看到图标
- 类型转换问题
- 请问:如何设置字体
怀疑在CreateInstance时,占用了错误的栈的地址,
因此在退出恢复栈时,导致内存错误。
1 是在CreateInstance后,加了Open以后,再退出就没有什么问题了。
2 或者不加Open,直接加这一句也行:m_MainConn=NULL,这样退出也没有什么问题。
theApp是全局变量,其成员变量m_MainConn作用域也是全局的,所以它的析构函数会在整个程序结束后由CRT调用.这个时候线程TLS都应该已经释放了(我的推测)由AfxOleInit只对调用线程有效这点来分析,它的内部机制肯定跟TLS有关,而m_MainConn的析构函数调用的时候线程TLS已经释放,调用成错也就情理之中了讲得不对还请指教 :)
在使用时应该初始化。
倘若只定义了指针,而没有初始化。m_MainConn可能会随机获得一个地址,在释放时就会出现指针异常。
加了 m_MainConn->Open()就不出问题了,m_MainConn有了确定的地址空间。系统在释放时自然就不会出错!
个人理解!仅供参考!
因此在退出恢复栈时,导致内存错误。
Open后,获得真正的地址,或者 = NULL,不分配地址
----------
应该是这个原因,武林散人回答的。
m_MainConn = NULL后不出现异常很好理解,因为这个实际上调用了Release,智能指针的m_pInterafce也NULL了.
现在关键是Open()后为什么不出现异常...我大概跟了一下,断点分别设在CreateInstance后,Open后和智能指针的析构中,发现
1. CreateInstance和Open后,对象的内存空间是没有变化的
2. 如果不调用Open,全局智能指针析构时, m_pInterafce指向的对象空间已经释放了,内存里是一堆"?", 所以mov eax, [ecx]时会报access violation
3, 如果调用了Open,不管是否成功, 则这片空间在析构时还未释放掉,可以正确调用Release现在的关键就是对象的这片空间是什么时候释放的, 可以肯定不是在CoUninitialize中,由于对调试器使用还不熟练,我也没跟出具体位置...唉,看有没有哪个高手来解答了, 我学COM也是刚入门滴...
{
return -1;
}用这个初始化,不要用AfxOleInit