2011-09-10 18 views
0

私はオブジェクト にコンストラクタを構築しようとするたびに、私はアクセス違反の例外を取得するには、あるとデストラクタはアクセス違反OpenCVのC++のdll

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

EDIT 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()を実行することはできません。あなたがそうするとき、オブジェクトの内部構造をゴミ箱に入れます。代わりに、メンバー変数を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によって削除されました。私は問題は、同じメモリブロック上で動作する2つの異なるアロケータによって引き起こされると考えています。同じ割り当て関数でメモリが割り当てられ、割り当てが解除されていることを確認する必要があります。あなたはOpenCVをあなたのメインアプリとあなたのDLLに対してリンクさえしているかもしれません、そして、これらは同じライブラリの2つの別々のインスタンスです。

編集#2:問題の詳細については、this articleを参照してください。コメントで述べたように、この問題を回避するには、モジュール間のメモリ割り当て/解放を避けるためにコードを再編成する必要があります。

+0

ありがとうございます。しかし、問題は、他の多くのクラスで使用されているため、ラッパーで変更できないということです。そして、私はエラーの原因を追跡しようとし、それはデストラクタであるようです。これを解決するために私を助けることができますか? –

+0

私が言ったように、あなたがやっていることは動作することが保証されていない、C++クラスのレイアウトはほとんどの場合、構造と同じではないので、このポインタが指すメモリにデータをコピーすることはできません。さらにコードを投稿してください。特に、Imageクラスの定義方法を示す必要があります。 – Miguel

+0

質問を編集しましたが、今度はクラス定義 –

関連する問題