带有 .NET 的 C++ dll:内存泄漏是确定的吗?

Posted

技术标签:

【中文标题】带有 .NET 的 C++ dll:内存泄漏是确定的吗?【英文标题】:C++ dll with .NET: are memory leaks determinate? 【发布时间】:2013-08-23 09:00:43 【问题描述】:

我有 Windows Forms(C#) 应用程序,它使用 C++ dll(非托管代码)。加载图像,然后调用 dll 函数对其进行处理。 问题是:exception: std::bad_alloc 在我连续多次从 dll 调用函数时抛出。 可能问题是因为没有删除 dll 中的内存,可能是因为 Windows 窗体中的垃圾收集器。 如何判断应用程序中的哪个项目导致内存泄漏?

【问题讨论】:

使用内存分析器或堆调试器。我肯定会先从一个不受管理的开始。 Umdh.exe 价格合适。 【参考方案1】:

我最近遇到了类似的问题,我设计了一个有用的解决方案。您可以编写一个名为“freeObject”的解构函数,与 ~* 函数不同,您应该显式调用“freeObject”函数。这是一个例子。

void VideoAbstraction::freeObject()
    videoCapture.~VideoCapture();
    videoWriter.~VideoWriter();
    backgroundImage.release();              
    currentStartIndex.release();
    currentEndIndex.release();
    mog.~BackgroundSubtractorMOG2();
    gFrame.release();           
    gForegroundMask.release();  
    gBackgroundImg.release();   
    currentMask.release();  
    vector<ObjectCube>().swap(partToCompound);  
    vector<Mat>().swap(compoundResult);
    vector<Mat>().swap(indexs);
    vector<Mat>().swap(indexe);
    vector<int>().swap(frame_start);
    vector<int>().swap(frame_end); 

外呼部分就是这样。

void UserVideoAbstraction::UserfreeObject()
    userVB->freeObject();

【讨论】:

以上是关于带有 .NET 的 C++ dll:内存泄漏是确定的吗?的主要内容,如果未能解决你的问题,请参考以下文章

为啥.NET 没有内存泄漏?

Unity - Android, C# - C++ 内存泄漏

C ++调用COM DLL中的函数可能发生内存泄漏

使用 VS Code 在 C++ 应用程序中查找内存泄漏

无法在 VB.NET 中使用带有来自 Visual C++ DLL 的指针参数的函数

堆中的 DLL 内存泄漏