访问违反opencvc++ dll

Access violation OpenCV C++ dll

本文关键字:dll opencvc++ 访问      更新时间:2023-10-16

我是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:请参阅本文以获得对该问题的更深入解释。正如我在评论中所说的,如果你想避免这个问题,你需要重新组织你的代码,以避免跨模块的内存分配/释放。