Нарушение прав доступа OpenCV C ++ dll - PullRequest
0 голосов
/ 11 сентября 2011

Я новичок в C ++, Я получаю исключение нарушения прав доступа всякий раз, когда пытаюсь создать объект конструктор выглядит следующим образом

Image::Image( IplImage* pIplImage, bool bDestroy )
    : m_bOwned( bDestroy )
{
    memcpy( static_cast< IplImage* >( this ), pIplImage, sizeof( IplImage ) );

    if ( bDestroy ) 
        cvReleaseImageHeader( &pIplImage );

}

и деструктор

Image::~Image()
{
    if ( m_bOwned )
        cvFree( reinterpret_cast< void** >( &imageDataOrigin ) );
}

РЕДАКТИРОВАТЬ 1: определение класса

class VISION_EXPORT Image
    : public IplImage
    , private boost::noncopyable
{
public:

explicit Image( IplImage* pIplImage, bool bDestroy = true );
~Image();
private:    
bool m_bOwned;
};

Раньше это работало, но теперь, когда я экспортирую его как dll ... оно больше не работает. Вы можете мне помочь?

1 Ответ

2 голосов
/ 11 сентября 2011

Вы не можете сделать 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 : См. в этой статье для более глубокого объяснения проблемы. Как я сказал в комментариях, если вы хотите избежать этой проблемы, вам нужно будет реорганизовать свой код, чтобы избежать межмодульного выделения / освобождения памяти.

...