内存泄漏c ++/cli方法

fmv*_*ior 0 .net opencv memory-leaks c++-cli visual-c++

看起来这个方法在调用时会产生内存泄漏.如果我不打电话,那就没有内存泄漏.知道是什么原因引起的吗?

该函数是ac#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;


}
Run Code Online (Sandbox Code Playgroud)

更新#1:

当我删除此行时:

overviewOneImages->Add(hh1);
Run Code Online (Sandbox Code Playgroud)

泄漏消失了.

我需要以不同的方式做这一行.有任何想法吗?

更新#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);


    }
Run Code Online (Sandbox Code Playgroud)

看起来它应该是这条线

       f1= ovrImageCurrent;
Run Code Online (Sandbox Code Playgroud)

把它改成

       ovrImageCurrent.copyTo(f1) 
Run Code Online (Sandbox Code Playgroud)

解决它.

知道为什么第一个是不正确的,不能处理?还有更好的方法来解决它吗?

Jim*_*hel 5

非常简化,您的代码如下所示:

hh1 = allocate a bunch of memory
add hh1 to overviewOneImages
return overviewOneImages
Run Code Online (Sandbox Code Playgroud)

每当你调用那个函数时,假设hh1没有设置null,你就会吃更多的内存.毕竟,您的overviewOneImages列表维护对已分配内存的引用,因此垃圾收集器无法释放它.

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

完成使用后,您需要从列表(或字典)中删除内容.