访问冲突OpenCV C ++ DLL

时间:2011-09-10 20:48:39

标签: c++ pointers casting opencv access-violation

我是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 个答案:

答案 0 :(得分: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。正如我在评论中所说,如果你想避免这个问题,你需要重新组织你的代码,以避免跨模块内存分配/释放。