访问违反opencvc++ dll
Access violation OpenCV C++ dll
我是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:请参阅本文以获得对该问题的更深入解释。正如我在评论中所说的,如果你想避免这个问题,你需要重新组织你的代码,以避免跨模块的内存分配/释放。
相关文章:
- 挂起和取消挂起一个文件DLL
- std::threads可以从Windows DLL中的全局变量创建/销毁吗?
- 导入库可以跨dll版本工作吗
- 从C++dll访问C#中的一行主要参数
- 链接到自行创建的dll失败
- 为什么使用 P/Invoke 调用 dll 时,某些计算机中的 LoadLibrary 失败?
- 在调用FreeLibrary后,释放动态链接到具有相同版本的CRT堆的DLL的内存
- 如何指定我希望我的LIB链接到的DLL文件?-Visual Studio 2019
- 如何将图像传输到c++(dll)中的缓冲区,然后在c#的缓冲区中读/写
- C++:将外部库链接到dll库
- 在 Windows 上,是否可以让 dll 在不使用 PATH 环境变量的情况下在另一个文件夹中查找依赖项?
- 不同的Visual Studio版本中缺少.dll
- 从DLL中删除类的实例
- 如何包装第三方DLL在R中使用
- 使用c#访问c++dll中带有char*参数的函数时发生AccessViolationException
- 系统.将数组移交给c#中动态加载的c++DLL时发生AccessViolationException
- 为什么导入Mixed native/CLR lib.dll的本机C++应用程序没有在Mixed lib.dll中的外部变
- 当我使用 C++ 中的 C# dll 来使用 Selenium 时,存在异常处理问题
- 如何使用just *.从opencvc++中替换*.dll文件
- 访问违反opencvc++ dll