.net 内存泄漏c++/cli方法

.net 内存泄漏c++/cli方法,.net,opencv,visual-c++,memory-leaks,c++-cli,.net,Opencv,Visual C++,Memory Leaks,C++ Cli,调用此方法时,似乎正在创建内存泄漏。如果我不调用它,就不会有内存泄漏。 知道是什么引起的吗 该函数是c++应用程序调用的c++/cli dll的一部分 漏洞消失了 我需要用不同的方式来做这行。有什么想法吗 更新#2: 事实证明,在代码的这一部分调用函数时会发生泄漏 if(!violationAssets->TryGetValue("OVERVIEW_ONE", overviewOneImages)) { cv::Mat f1; capture

调用此方法时,似乎正在创建内存泄漏。如果我不调用它,就不会有内存泄漏。 知道是什么引起的吗

该函数是c++应用程序调用的c++/cli dll的一部分

漏洞消失了

我需要用不同的方式来做这行。有什么想法吗

更新#2:

事实证明,在代码的这一部分调用函数时会发生泄漏

    if(!violationAssets->TryGetValue("OVERVIEW_ONE", overviewOneImages))
    {
        cv::Mat f1;
        captureOverview>>ovrImageCurrent; 

        if (fileCorruptFlag==0)
            f1= ovrImageCurrent;

        if (windowOn && !fileCorruptFlag)
        {
            cv::namedWindow( "Frame1", 1 ); 
            cv::imshow( "Frame1", f1 );  
            cv::waitKey(1);
        }

    overviewOneImages = writejpeg(f1, overviewOneImages,   violationAssets,"OVERVIEW_ONE",fileCorruptFlag);


    }
看起来这条线已经到期了

       f1= ovrImageCurrent;
改成

       ovrImageCurrent.copyTo(f1) 
修复它


你知道为什么第一个是不正确的,不能处理吗?还有更好的修复方法吗?

大大简化了,您的代码如下所示:

hh1 = allocate a bunch of memory
add hh1 to overviewOneImages
return overviewOneImages
每次调用该函数时,假设
hh1
未设置为
null
,则会占用更多的内存。毕竟,您的
overviewOneImages
列表维护对已分配内存的引用,因此垃圾收集器无法释放它

此外,有些代码在某些情况下会分配一个新列表,该列表会添加到
violationAssets
字典中。同样,字典维护对已分配内存的引用,因此垃圾收集器无法释放它


在使用完列表(或字典)后,您需要将其从列表(或字典)中删除。

大大简化了,您的代码如下所示:

hh1 = allocate a bunch of memory
add hh1 to overviewOneImages
return overviewOneImages
每次调用该函数时,假设
hh1
未设置为
null
,则会占用更多的内存。毕竟,您的
overviewOneImages
列表维护对已分配内存的引用,因此垃圾收集器无法释放它

此外,有些代码在某些情况下会分配一个新列表,该列表会添加到
violationAssets
字典中。同样,字典维护对已分配内存的引用,因此垃圾收集器无法释放它



在使用完列表(或字典)后,您需要将其从列表(或字典)中删除。

您如何知道内存泄漏?也许垃圾收集器还没有收集新的GCD对象?你是如何检测内存泄漏的?它的增长速度有多快?这个函数调用的上下文是什么?(例如,您要对其进行多少次调用…)在任务管理器中,我观察该进程的内存。我让应用程序在循环中调用dll。每次通话的内存将增加0.5mb至1mb。如果我不在DLL中调用该函数,它不会增加。gc堆中分配的内存将在垃圾收集循环中释放,这不是内存泄漏。如果您想自己处理它,只需
删除它,而不是
hh1=nullptr。它应该在每次调用dll后自动释放吗?您如何知道内存泄漏?也许垃圾收集器还没有收集新的GCD对象?你是如何检测内存泄漏的?它的增长速度有多快?这个函数调用的上下文是什么?(例如,您要对其进行多少次调用…)在任务管理器中,我观察该进程的内存。我让应用程序在循环中调用dll。每次通话的内存将增加0.5mb至1mb。如果我不在DLL中调用该函数,它不会增加。gc堆中分配的内存将在垃圾收集循环中释放,这不是内存泄漏。如果您想自己处理它,只需
删除它,而不是
hh1=nullptr
。每次调用dll后是否会自动释放?@fmvpsenior:我不知道你想做什么,所以我无法提供任何更好的建议。这行是overviewOneImages->Add(hh1);我想看看如何添加hh1而不创建leak@fmvpsenior:我不明白您希望如何分配内存,返回对所述内存的引用,并以某种方式同时释放该内存。人们会假设您正在将
hh1
添加到列表中,因为您稍后将使用它。这不是“泄密”,而是正常行为。可能问题是调用方正在使用内存,但没有释放内存(即从列表中删除)?如果应用程序使用了数组,那么,是的,应用程序应该将其从列表中删除。@fmvpsenior:我不知道你想做什么,所以我无法提供任何更好的方法建议。这是一行overviewOneImages->Add(hh1);我正在尝试查看如何添加hh1而不创建leak@fmvpsenior:我不明白您希望如何分配内存,返回对所述内存的引用,并以某种方式同时释放该内存。人们会认为您正在将
hh1
添加到列表中,因为您稍后将使用它。这不是“泄漏”,但正常行为。可能问题是调用方正在使用内存,但没有释放内存(即从列表中删除)?如果应用程序使用数组完成,则是的,应用程序应将其从列表中删除。
hh1 = allocate a bunch of memory
add hh1 to overviewOneImages
return overviewOneImages