CImage对象的深层副本导致调试断言失败

时间:2014-10-08 14:22:07

标签: c++ memory-leaks mfc deep-copy bitblt

我遇到类似这样的问题:How to copy a CImage object? 我需要制作一个CImage对象的深层副本。具体问题是我通过PostMessage从辅助线程获取CImage *,并希望将其复制到CImage对象,这是不同类的属性。

我目前有以下代码:

LRESULT CMainFrame::TransApplied(UINT wParam,LONG lParam)
{
    DEB("message recieved\n"); //this is debug message to output
    CImage *obrazek=(CImage* )wParam;
    int a;
    CString t;
    CImage tymczas;
    obrazek->Save(_T("mesydz.jpg"));//checking if the image is valid
    DEB("o1\n");
    obrazek->GetDC();
 PointerToViewClass->przetransformowany.Create(obrazek->GetWidth(),obrazek->GetHeight(),obrazek->GetBPP());
    DEB("o2\n");
     obrazek->BitBlt(PointerToViewClass->przetransformowany.GetDC(),0,0,SRCCOPY);


//  obrazek->ReleaseDC();
    DEB("o8\n");
     PointerToViewClass->przetransformowany.ReleaseDC();
    DEB("o6\n");

    DEB("o7\n");
    obrazek->ReleaseDC();
    //delete obrazek;
    return 0;
}

我怀疑obrazek-> GetDC()和obrazek-> ReleaseDC()有问题。当我有obrazek-> GetDC()时,我没有错误(但是在obrazek-> BitBlt(...);)上有调试断言失败,尽管我无法释放obrazek的DC和/或删除我想做的o​​brazek对象,因为如果我不这样做,我会有内存泄漏。

所以一般来说,我不知道有关复制对象的事情。

编辑:

另一个线程以下列方式处理CImage:

   CImage wyniczek;   
   CImage *doprzeslania;

   objekt->ApplyTransform(macierz,&wyniczek);//object is an object of a class declared in dll

  doprzeslania=new CImage(wyniczek);

   PostMessage(data->parent,MY_WM_MESSAGE4,(WPARAM)doprzeslania,(LPARAM)3);

 delete objekt;
 FreeLibrary(hDLL);
 delete data;//deleting an object with settings for the thread
 return 0;

此外,图片中的dll发生了什么:

void IProcess::ApplyTransform(std::vector<double> matrix,CImage *rezult)
{
//
//some image processing here
//
output.Create(dest.cols,dest.rows,24);
BITMAPINFO bmi; //it is initialized properly, had erased it for clarity
StretchDIBits(output.GetDC(),0,0,dest.cols,dest.rows,0,0,dest.cols,dest.rows,temp.data,&bmi,DIB_RGB_COLORS,SRCCOPY); //copy from opencv Mat object to CImage

rezult->Create(output.GetWidth(),output.GetHeight(),24);

 output.BitBlt(rezult->GetDC(),0,0,SRCCOPY); //copy to CImage *rezult

output.ReleaseDC();
rezult->ReleaseDC();
}

1 个答案:

答案 0 :(得分:0)

最后我想出了这里出了什么问题!

问题是,在辅助线程中我将CImage对象返回到另一个CImage对象(它保存在堆栈中):

CImage wyniczek;
objekt->ApplyTransform(macierz,&wyniczek);

然后将其与复制构造函数一起复制到堆上构造的新对象:

CImage *doprzeslania;
doprzeslania=new CImage(wyniczek);

所以一般情况下,* doprzeslania对象只有在辅助线程运行时才有效,这导致奇怪的行为,我能够在接收PostMessage的函数开始时正确保存它,但是无法将其复制到另一个对象。 解决方案是直接从函数中将图像转换为* doprzeslania对象:

CImage *doprzeslania;
doprzeslania=new CImage();
objekt->ApplyTransform(macierz,doprzeslania);

现在我有问题在屏幕上显示这个图像,但在我问另一个问题之前,我将不得不亲自调查它。谢谢大家的帮助!