[英]Access violation OpenCV C++ dll
我是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 ..它不再起作用了。 你能幫助我嗎?
你不能寫一個寫入this
指針指向的內存的memcpy()
。 當您這樣做時,您將刪除對象的內部結構。 相反,您應該做的是將成員變量添加到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 :有關問題的更深入解釋,請參閱此文章 。 正如我在評論中所說,如果您想避免此問題,則需要重新組織代碼以避免跨模塊內存分配/釋放。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.