我不明白为什么这个程序会出现损坏的堆错误(我使用 OpenCV 作为类Mat
):
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();
我读到返回一个对象的副本在 C++ 中比引用更优雅。所以我想知道什么是错的。
编辑:Visual Studio 中断,a->decode(vect)
但它仅在我返回对象而不是引用时发生。
编辑 2:我编辑了代码以反映完整的程序。我认为问题来自a
同时复制和修改的共享对象。我将使用互斥锁查看问题是否仍然存在。