看起来这个方法在调用时会产生内存泄漏。如果我不打电话,那就没有内存泄漏。 知道是什么导致了它吗?
该函数是c#app调用的c ++ / cli dll的一部分。
List<array<Byte>^>^ writejpeg( cv::Mat ovrImagePrevious, List<array<Byte>^>^ overviewOneImages, Dictionary<String^,List<array< Byte >^>^>^ violationAssets, String ^ value, int fileCorruptFlag )
{
vector<uchar> buf1;//buffer for coding
vector<int> param = vector<int>(2);
param[0]=CV_IMWRITE_JPEG_QUALITY;
param[1]=100;//default(95) 0-100
int img_sz1=ovrImagePrevious.cols*ovrImagePrevious.rows;
array <Byte>^ hh1 = gcnew array<Byte> (img_sz1);
if (fileCorruptFlag==1)
{img_sz1=1;
hh1=nullptr;}
else
{
cv::imencode(".jpeg", ovrImagePrevious, buf1, param);
for(int i=0; i < buf1.size(); i++)
{
hh1[i] = buf1[i];
}
}
if(!violationAssets->TryGetValue(value, overviewOneImages))
{
overviewOneImages = gcnew List<array<Byte>^>();
violationAssets->Add(value, overviewOneImages);
}
overviewOneImages->Add(hh1);
return overviewOneImages;
}
更新#1:
当我删除此行时:
overviewOneImages->Add(hh1);
泄漏消失了。
我需要以不同的方式做这一行。有什么想法吗?
更新#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)
修复它。
知道为什么第一个是不正确的,不能处理?还有更好的方法来修复它吗?
答案 0 :(得分:5)
非常简化,您的代码如下所示:
hh1 = allocate a bunch of memory
add hh1 to overviewOneImages
return overviewOneImages
每次调用该函数时,假设hh1
未设置为null
,您将会多吃一点内存。毕竟,您的overviewOneImages
列表维护对已分配内存的引用,因此垃圾收集器无法释放它。
此外,还有一些代码会在某些情况下分配新列表,并且该列表会添加到violationAssets
字典中。同样,字典维护对已分配内存的引用,因此垃圾收集器无法释放它。
完成使用后,您需要从列表(或字典)中删除内容。