Глубокая копия объекта CImage приводит к ошибке отладки

У меня есть проблема, похожая на эту: Как скопировать объект CImage?
Мне нужно сделать глубокую копию объекта CImage. Конкретная проблема заключается в том, что я получаю CImage * из вторичного потока через PostMessage и хочу скопировать его в объект 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 (…);) не удалось выполнить отладочное утверждение, хотя я не могу освободить DC образца и / или удалить объект образца, что я хотел бы сделать, потому что у меня утечки памяти, если я не делаю этого.

так что в общем-то есть что-то, чего я не знаю о копировании объекта.

РЕДАКТИРОВАТЬ:

другой поток обрабатывает 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();
}

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);

Теперь у меня есть проблема с отображением этого изображения на экране, но прежде чем я задам еще один вопрос, мне придется рассмотреть его поближе. Спасибо всем за помощь!

0

Другие решения