我是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时......它不再起作用了。 你能救我吗?
答案 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。正如我在评论中所说,如果你想避免这个问题,你需要重新组织你的代码,以避免跨模块内存分配/释放。