2011-09-10 3 views
0

, 나는 액세스 위반 예외가액세스 위반 OpenCV의 C++ 나 C++에 새로 온 사람 DLL

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

왜 라이브러리가 이미 C++ 인터페이스를 제공 할 때 OpenCV 이미지 구조에 대해 자체 C++ 래퍼가 필요합니까? –

+0

미들웨어의 일부이며 그대로 사용해야합니다. –

+0

어디에서 액세스 위반이 발생합니까? IT 부서는 배열의 끝에서부터 힙을 통해 작성하여 후속 할당이 액세스 위반을 유발할 수 있습니다. – Goz

답변

2

포인터가 가리키는 메모리에 쓰는 memcpy()을 수행 할 수 없습니다. 그렇게하면 개체의 내부 구조가 휴지통으로 바뀝니다. 대신, 회원 변수를 Image 클래스에 추가하면됩니다. 예를 들어 : 위에서 보듯이

Image::Image(IplImage* pIplImage, bool bDestroy) 
: m_pImage(pIplImage), m_bOwned(bDestroy) 
{ 
} 

Image::~Image() 
{ 
    if (m_bOwned) 
     cvReleaseImage(m_pImage); 
} 

, 나는 당신이 어떤 데이터를 복사 할 필요가 있다고 생각하지 않습니다

class Image { 
protected: 
    pIplImage* m_pImage; 
    bool m_bOwned; 
// ... whatever else you need here ... 
}; 

그런 다음 구현은 다음과 같이 될 수 있습니다. 이 클래스를 인스턴스화하는 코드는 이미지의 소유권을 클래스에 전달할지 여부를 결정하지만 Image 클래스는 포인터를 복사 만합니다.

편집 : 코드를보고 난 후에 무엇이 잘못 될 수 있는지 생각합니다. 생성자에 전달 된 IplImage 포인터는 주 응용 프로그램에 의해 할당되고 DLL에 의해 삭제되었습니다. 문제는 동일한 메모리 블록에서 작동하는 두 개의 다른 할당자가 원인이 될 것입니다. 동일한 할당 함수에 의해 메모리가 할당되고 해제되어야합니다. OpenCV는 주 앱과 DLL에 연결될 수도 있습니다.이 라이브러리는 OpenCV가 동일한 라이브러리의 두 인스턴스로 분리되어 있습니다.

편집 # 2 : 문제에 대한 자세한 설명은 this article을 참조하십시오. 의견에서 말했듯이,이 문제를 피하려면 모듈 간 메모리 할당/할당 해제를 피하기 위해 코드를 재구성해야합니다.

+0

대단히 감사합니다.하지만 문제는 다른 많은 클래스에서 사용되기 때문에 래퍼에서 변경할 수 없다는 것입니다. 그리고 나는 오류의 출처를 추적하려고 시도했고 그것은 소멸자 인 것처럼 보인다. 이 문제를 해결하기 위해 나를 도울 수 있습니까? –

+0

내가 말했듯이 C++ 클래스의 레이아웃은 대부분의 경우 구조와 같지 않으므로이 포인터가 가리키는 메모리로 데이터를 복사 할 수 없습니다. 더 많은 코드를 게시하십시오. 특히 Image 클래스가 정의 된 방법을 보여줘야합니다. – Miguel

+0

질문을 편집했습니다. 이제 클래스 정의가 포함됩니다. –

관련 문제