나는 (I 클래스 Mat
에 대한 OpenCV의를 사용하고 있습니다)이 프로그램 손상된 힙 오류가 왜 이해가 안가 :왜 개체를 반환 할 때 힙 손상이 발생합니까?
class A {
private:
Mat image;
static UINT ThreadProc(LPVOID pParam) {
A* pThis= (ClientNetwork*)pParam;
UINT nRet= pThis->DoThreadProc(); // get out of 'static mode'
return(nRet);
}
UINT ClientNetwork::DoThreadProc() {
vector<uchar> vect;
while(1) {
/**** initialize vect and get the image data to decode ****/
decode(vect);
}
}
public:
void decode(const vector<uchar>& vectorData){image=imdecode(vectorData, CV_LOAD_IMAGE_COLOR);}
Mat get_image(){return image;}
void start() {m_pcThread= AfxBeginThread(ThreadProc, this);}
}
int main() {
A* a = new A();
a->start();
while(1) {
Mat image = a->get_image();
}
delete a;
return 0;
}
내가 참조를 반환하는 경우 때문에 오류가 Mat image = a->get_image();
에서 온 것 같다 대신 객체의 복사본, 나는 더 이상 오류가 없습니다 :
Mat* get_image(){return ℑ}
및
Mat* image = a->get_image();
내가 r에 객체의 복사본을 반환하는 것은 참조보다는 C++에서 더 우아합니다. 그래서 나는 무엇이 잘못되었는지 알고 싶다.
EDIT : Visual Studio는 a->decode(vect)
에 나옵니다.하지만 객체가 아닌 참조가 반환 될 때만 발생합니다.
편집 2 : 전체 프로그램을 반영하도록 코드를 편집했습니다. 나는 문제가 복사 및 수정 동시에 공유 객체 a
에서 온 것 같아요. 뮤텍스를 사용하여 문제가 계속 발생하는지 확인할 수 있습니다.
'벡터'을 참조 또는 const 참조로 가져옵니다. –
Ajay
@Ajay 오류가 있습니다.참조로 전달하면 복사본을 피할 수 있지만'decode'의 끝에서 삭제됩니다. 맞습니까? – Seltymar
그 대답은 아니지만, 추천했다. – Ajay