具体问题如下:
  我用MFC中单文档视图架构生成了一程序,在CMyWinApp类中声明了一 _ConnectionPtr变量m_MainConn,同时在 CMyWinApp类中的 InitInstance中,加了AfxOleInit()来初始化,以及 m_MainConn.CreateInstance(__uuidof(Connection))
程序编译运行没有问题,但是当关闭程序的时候,就发生异常,大致的意思是说:某指令引起的内存错误,该内存不能为"read".
   当我把 m_MainConn.CreateInstance(__uuidof(Connection))这行代码去掉后,发现就没有刚才说的问题了。请问这是什么原因引起的?

解决方案 »

  1.   

    是否是ADO的版本问题呢?谢谢zhuzhu
      

  2.   

    把这个变量m_MainConn初始化 m_MainConn = NULL.试一下
      

  3.   

    同意楼上的。
    怀疑在CreateInstance时,占用了错误的栈的地址,
    因此在退出恢复栈时,导致内存错误。
      

  4.   

    好像调用AfxOleInit()就不需要CreateInstance(__uuidof(Connection))了吧?
      

  5.   

    谢谢楼上的回复,这个问题已经解决了:
     1 是在CreateInstance后,加了Open以后,再退出就没有什么问题了。
     2  或者不加Open,直接加这一句也行:m_MainConn=NULL,这样退出也没有什么问题。
      

  6.   

    我迟一点再结帖,看看有没有高手对 我的答案再解释一下。为什么加了 m_MainConn->Open()后,程序退出就不会有内存错误呢?
      

  7.   

    大概看了一下, 应该是变量作用域的问题
    theApp是全局变量,其成员变量m_MainConn作用域也是全局的,所以它的析构函数会在整个程序结束后由CRT调用.这个时候线程TLS都应该已经释放了(我的推测)由AfxOleInit只对调用线程有效这点来分析,它的内部机制肯定跟TLS有关,而m_MainConn的析构函数调用的时候线程TLS已经释放,调用成错也就情理之中了讲得不对还请指教 :)
      

  8.   

    恩,又想了想,你说加了m_MainConn->Open()后没出问题, 那好象我的分析又说不过去...汗自己一个...
      

  9.   

    先谢谢jasonshark的回复。为什么 加了 m_MainConn->Open()就不出问题了,这点我觉得尤其怪异。
      

  10.   

    _ConnectionPtr这个是智能指针。
    在使用时应该初始化。
    倘若只定义了指针,而没有初始化。m_MainConn可能会随机获得一个地址,在释放时就会出现指针异常。
    加了 m_MainConn->Open()就不出问题了,m_MainConn有了确定的地址空间。系统在释放时自然就不会出错!
    个人理解!仅供参考!
      

  11.   

    怀疑在CreateInstance时,占用了错误的栈的地址,
    因此在退出恢复栈时,导致内存错误。
    Open后,获得真正的地址,或者 = NULL,不分配地址
    ----------
    应该是这个原因,武林散人回答的。
      

  12.   

    唉,这两天还是没有时间深入研究这个...但是跟全局智能指针的使用有关是肯定的了
    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也是刚入门滴...
      

  13.   

    谢谢jasonshark, lfchen, qlftl等几位弟兄们,我再过一段时间来结帖。看有没有高手来回答一下 jasonshark的问题。
      

  14.   

    if (!SUCCEEDED(CoInitialize(NULL)))
    {
        return -1;
    }用这个初始化,不要用AfxOleInit