我的程序现在有这样一个调用关系:("->"表示通过.lib隐式调用)[exe] -> [ext dll 1] -> [ext dll 2]
  |                         |^
  ---------------------------这三个模块里分别都含有一些资源,但是很少。主要是版本信息,还有几个ICON。当用_MBCS编译运行,退出时,Output窗口只有一堆DLL加载卸载等正常信息。
当用_UNICODE编译运行,退出时,Output窗口显示出怒长一串“Memory leak detected”!我上面说的“运行”是按F5叫起程序,但不做任何事,马上再关掉。并且这些模块的入口点函数里,除了向导生成的东东外,也没做任何事。换句话说,我能保证这么内存泄漏 不是 由于诸如自己忘记释放内存等引起的。小弟特来请教一下诸位师长前辈,这是怎么一回事?我看到MFC向导在生成MFC扩展DLL的入口点函数里,在“new CDynLinkLibrary(xxxxDLL);”一句的上面提到:如果扩展dll不是直接从exe调用,则要怎么怎么着,我也试着做了,没有效果。而且在内存泄漏信息里,竟然还有没被删除的那个CDynLinkLibrary对象!我跟踪了一下,见识了那个纷繁芜杂的“Resource List”,不过看到CDynLinkLibrary对象也被delete了啊?怎么搞的啊?为啥专门_UNICODE版会这样哩?

解决方案 »

  1.   

    你所有的Module都是用_UNICODE&UNICODE编译的吗?
      

  2.   

    对对,都是_UNICODE编译的。另外,我上面的图的意思是:exe连接了dll 1的lib,dll 1连接了dll 2的lib, 而exe也连接了dll 2的lib。
    我说明白了吗?我知道这样设计有些糟糕。但目前暂时只能如此。
      

  3.   

    版本要统一
    给你一段代码,供参考:
    #ifdef _DEBUG
    #pragma comment(lib,"\\EPID2000\\lib_debug\\CJ60Libd.lib")
    #else
    #pragma comment(lib,"\\EPID2000\\lib\\CJ60Lib.lib")
    #endif
      

  4.   

    UNICODE使用宽字符,所以会分配ANSI分配内存的两倍,检查你的程序,看看是不是自始至终都是UNICODE呢?
    我的意思就是UNICODE分配的内存,ANSI函数释放的,肯定不行,就算是系统的API和库函数,控制不好的话,也是有问题的。
      

  5.   

    用链接库对应的版本,注意函数也要用Unicode函数