用DLL封装了ADO操作,在DLL中定义一个类,类中把ADO中常用的三个智能指针对象作为成员。用这个类定义全局对象,因为数据库连接整个程序运行期间有效。主调用程序调用DLL进行数据库操作一切正常,就是当主调用程序退出时报错,内存冲突。要是类定义一个局部对象则没有这样的问题。要是把那三个智能对象从类中拿出作为全局变量问题也是一样的。错误发生在对智能指针的释放上。

解决方案 »

  1.   

    在导出一个函数,功能如:CloseDB   释放ADO资源
      

  2.   

    TO:ruibin1984 你说的方法是可行的,但我更想知道原因。而LS说的我不太同意,要是每个操作都得重新连接数据库的话开销太大效率也太低。查了下,这个贴所遇问题与我相同,也提出类似解决方法,只是没有对这个问题进行深入分析。
    http://topic.csdn.net/t/20030521/11/1812817.html
      

  3.   

    我也同意,在哪个DLL申请的资源,还在在哪个DLL释放,那样就不会发生内存错误了
      

  4.   

      同意一楼 ,extern 
    "C"_declspec(dllexport) void ADO_Free()
    {
            theApp.m_pConnection.Release();
    theApp.m_pRecordset.Release();
    }
      

  5.   

    这样最安全,资源释放,系统只能自动完成一部分,dll加载的需要自己释放哦
      

  6.   

    应该是com环境释放之后仍然调用com函数(ADO函数)导致的;
    因为你使用的是全局变量,全局变量的释放(析构)在程序退出的最后才调用,包括释放com环境之后。
    所以你需要手动调用一个释放ADO资源的函数。
      

  7.   

    在导出的函数中只把m_pConnection = NULL;m_pRecordset=NULL;就可以