簡體   English   中英

訪問沖突OpenCV C ++ DLL

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM