.net 内存泄漏c++/cli方法
调用此方法时,似乎正在创建内存泄漏。如果我不调用它,就不会有内存泄漏。 知道是什么引起的吗 该函数是c++应用程序调用的c++/cli dll的一部分 漏洞消失了 我需要用不同的方式来做这行。有什么想法吗 更新#2: 事实证明,在代码的这一部分调用函数时会发生泄漏.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
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