Вы не можете сделать memcpy()
, который пишет в память, указанную указателем this
. Когда вы делаете это, вы разрушаете внутреннюю структуру объекта. Вместо этого вам следует добавить переменную-член в ваш класс Image
. Например:
class Image {
protected:
pIplImage* m_pImage;
bool m_bOwned;
// ... whatever else you need here ...
};
Тогда ваша реализация может выглядеть примерно так:
Image::Image( IplImage* pIplImage, bool bDestroy )
: m_pImage(pIplImage), m_bOwned( bDestroy )
{
}
Image::~Image()
{
if ( m_bOwned )
cvReleaseImage(m_pImage);
}
Как вы видите выше, я не думаю, что вам нужно копировать какие-либо данные. Код, который создает экземпляр этого класса, решает, хочет ли он передать владение изображением классу или нет, но в любом случае класс Image
просто копирует указатель.
Редактировать : после просмотра вашего кода я думаю, что у меня есть представление о том, что может быть не так. Указатель IplImage, переданный конструктору, был выделен основным приложением и удален DLL. Бьюсь об заклад, проблема вызвана тем, что два разных распределителя действуют на один и тот же блок памяти. Вы должны убедиться, что память выделена и освобождена теми же функциями выделения. Вы можете даже связать OpenCV с вашим основным приложением, а также с вашей DLL, и это два отдельных экземпляра одной и той же библиотеки.
Редактировать # 2 : См. в этой статье для более глубокого объяснения проблемы. Как я сказал в комментариях, если вы хотите избежать этой проблемы, вам нужно будет реорганизовать свой код, чтобы избежать межмодульного выделения / освобождения памяти.