访问冲突OpenCV C++;动态链接库 我是C++新手, 每当我试图构造一个对象时,就会出现访问冲突异常 构造函数如下所示 Image::Image( IplImage* pIplImage, bool bDestroy ) : m_bOwned( bDestroy ) { memcpy( static_cast< IplImage* >( this ), pIplImage, sizeof( IplImage ) ); if ( bDestroy ) cvReleaseImageHeader( &pIplImage ); }

访问冲突OpenCV C++;动态链接库 我是C++新手, 每当我试图构造一个对象时,就会出现访问冲突异常 构造函数如下所示 Image::Image( IplImage* pIplImage, bool bDestroy ) : m_bOwned( bDestroy ) { memcpy( static_cast< IplImage* >( this ), pIplImage, sizeof( IplImage ) ); if ( bDestroy ) cvReleaseImageHeader( &pIplImage ); },c++,pointers,casting,opencv,access-violation,C++,Pointers,Casting,Opencv,Access Violation,它以前可以工作,但现在当我将它导出为dll时。。它不再工作了。 你能帮我吗?你不能执行memcpy()写入这个指针指向的内存。当你这样做的时候,你会破坏对象的内部结构。相反,您应该做的是向Image类添加一个成员变量。例如: class Image { protected: pIplImage* m_pImage; bool m_bOwned; // ... whatever else you need here ... }; 那么您的实现可以是这样的: Image::Imag

它以前可以工作,但现在当我将它导出为dll时。。它不再工作了。
你能帮我吗?

你不能执行
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:有关该问题的更深入解释,请参阅。正如我在评论中所说,如果你想避免这个问题,你需要重新组织你的代码以避免跨模块内存分配/分配。< /P>当库已经提供C++接口时,为什么你需要自己的C++包装器来作为OpenCV图像结构?它是中间件的一部分,我应该把它当作它使用。你在哪里得到访问违规?这可能只是因为您写过了数组的末尾,然后通过堆写入,这可能会导致后续分配抛出访问冲突。同样,我们需要了解映像是如何定义的,以便我们可以确保您正在执行的memcpy是正常的。这个静态_转换看起来很奇怪…我仔细检查了它,memcpy不是导致错误的那一行,顺便说一下,图像包装器是从iplimage派生的非常感谢。。但问题是,我不允许在包装器中进行更改,因为它在许多其他类中使用。我试图追踪错误的来源,它似乎是析构函数。你能帮我解决这个问题吗?正如我所说,你所做的是不保证工作的,C++类的布局在大多数情况下与结构不一样,所以你不能把数据复制到这个指针所指向的内存中。发布更多的代码,特别是你应该展示图像类是如何定义的。即使我在我的应用程序中创建对象,这种情况也会发生?是的。如果在主应用程序中创建IplImage,则其图像缓冲区由应用程序的内存分配器分配。DLL使用的分配器不知道它,它不能删除它。好,这有意义,请原谅,但我是新的C++。是否有解决此问题的方法?
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);
}