none
MFC程序使用OpenCV动态库会误报内存泄露的问题 RRS feed

  • 问题

  •       新建一个MFC应用程序,导入OpenCV动态库,程序使用了opencv变量和函数。当程序在运行时,一切正常,但是点击应用程序关闭按钮时,那么问题就来了,输出窗口会出现一大堆内存泄漏问题。如下图所示:

    Detected memory leaks!
    Dumping objects ->
    {468} normal block at 0x0051D9B8, 8 bytes long.
     Data: <        > E4 DA C8 00 00 00 00 00 
    {467} normal block at 0x0051D980, 8 bytes long.
     Data: <8       > 38 DB C8 00 00 00 00 00 
    {466} normal block at 0x0051D948, 8 bytes long.
     Data: <        > 00 DB C8 00 00 00 00 00 
    {465} normal block at 0x0051D910, 8 bytes long.
     Data: <        > 1C DB C8 00 00 00 00 00 
    {464} normal block at 0x0051D8D8, 8 bytes long.
     Data: <$       > 24 A7 C1 00 00 00 00 00 
    {463} normal block at 0x0051D8A0, 8 bytes long.
     Data: <x       > 78 A7 C1 00 00 00 00 00 
    ......
    {178} normal block at 0x00514C28, 8 bytes long.
     Data: < V      > AC 56 A5 10 00 00 00 00 
    {177} normal block at 0x00514BF0, 8 bytes long.
     Data: < V      > 9C 56 A5 10 00 00 00 00 
    {176} normal block at 0x00514BB8, 8 bytes long.
     Data: < q      > C8 71 84 10 04 00 00 00 
    Object dump complete.
    程序“[13260] mfctest.exe”已退出,返回值为 2 (0x2)。

    实践证明,这是误报的内存泄漏。这个现象仅限于MFC Debug的情况,MFC Release不会。此外,Windows控制台应用程序也无此误报现象。


    前无古人,后无来者

    2021年5月31日 7:27

全部回复

  • 这个现象仅限于MFC Debug的情况,MFC Release不会”,这是不对的,Release版本的程序中没有检测内存泄漏的代码,当然不报了。Debug版本的程序中的内存分配、释放实现包含有已经分配、释放内存的跟踪,所以程序退出时根据是否内存泄漏(就是分配了没有调用相应的释放)报告给用户。
    2021年6月2日 6:15
  • 你好,

    >>MFC程序使用OpenCV动态库会误报内存泄露的问题

    导致这个问题的原因在于opencv相关的dll文件是在mfc dll之前加载的。

    我建议你可以尝试以下三种方案:

    1,将VS“配置属性 -> 通用 -> 使用MFC”从“在共享DLL中使用MFC”修改为“在静态库中使用MFC”。

    2,尝试将opencv dll封装成一个新的dll然后再MFC应用中使用。

    3,尝试使用延时加载DLL。针对Debug模式,点击VC++项目属性,进入属性页,依次找到通用属性 -> 链接器 -> 输入 -> 延迟加载DLL选项,然后将OpenCV bin文件下所有dll的名称添加到延迟加载DLL中. 添加后点击确定,然后重新编译程序。

    Best Regards,

    Jeanine


    "Visual c++" forum will be migrating to a new home on Microsoft Q&A !
    We invite you to post new questions in the "Developing Universal Windows apps" forum’s new home on Microsoft Q&A !
    For more information, please refer to the sticky post.

    2021年6月2日 8:16
    版主