2011-09-10 125 views
0

我是新的C++, 我得到的訪問衝突異常每當我試圖構造一個對象 的構造函數如下所示訪問衝突OpenCV的C++ DLL

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 ..它不再工作。 你能幫我嗎?

+0

爲什麼當庫提供了一個C++接口時,您需要自己的OpenCV映像結構的C++包裝? –

+0

它是中間件的一部分,我應該照原樣使用它。 –

+0

你從哪裏得到訪問違規? IT可能只是因爲你寫過一個數組的末尾並通過堆寫入,這會導致後續分配拋出訪問衝突。 – Goz

回答

2

您不能執行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:有關該問題的更深入解釋,請參閱this article。正如我在評論中所說的,如果你想避免這個問題,你需要重新組織代碼以避免跨模塊內存分配/釋放。

+0

非常感謝..但問題是我不允許在包裝中更改,因爲它在許多其他類中使用。我試圖跟蹤錯誤的來源,它似乎是析構函數。你能幫我解決這個問題嗎? –

+0

正如我所說,你所做的並不能保證工作,C++類的佈局與大多數情況下的結構不同,所以你不能將數據拷貝到這個指針指向的內存中。張貼更多的代碼,特別是你應該展示如何定義Image類。 – Miguel

+0

我編輯了問題,現在它包含類定義 –