2014-05-13 2 views
1

내 함수에서 메모리를 관리하는 데 약간의 문제가 있습니다. Valgrid는 변환 함수 뒤에 메모리 누수가 있다고 말합니다. 데이터가 제대로 릴리스되지 않았기 때문일 수 있습니까? 임시 포인터를 사용하려고했지만 프로그램이 충돌하거나 제대로 작동하지 않습니다. 전에이 문제가 발생 했나요? 변환 함수에 매트가있는 메모리 누수가 발생했습니다.

this->images.push_back(new cv::Mat());               //ID 
cv::threshold(*this->images[MASK], *this->images[ID], 0.0, 1.0, cv::THRESH_BINARY); 
this->images[ID]->convertTo(*this->images[ID], CV_32SC1); 

은 valgrid 출력입니다 : (! 다른 곳이나)

==5663== 64,339,996 bytes in 1 blocks are possibly lost in loss record 380 of 380 
==5663== at 0x4C2AB80: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) 
==5663== by 0x4E95117: cv::fastMalloc(unsigned long) (in /usr/local/lib/libopencv_core.so.2.4.9) 
==5663== by 0x4F31F38: cv::Mat::create(int, int const*, int) (in /usr/local/lib/libopencv_core.so.2.4.9) 
==5663== by 0x4F39CF9: cv::_OutputArray::create(cv::Size_<int>, int, int, bool, int) const (in /usr/local/lib/libopencv_core.so.2.4.9) 
==5663== by 0x4EB9373: cv::Mat::convertTo(cv::_OutputArray const&, int, double, double) const (in /usr/local/lib/libopencv_core.so.2.4.9) 
==5663== by 0x40D168: DataFrame::init() (DataFrame.cpp:68) 
==5663== by 0x40C943: DataFrame::DataFrame(char const*, LeafClassifier*) (DataFrame.cpp:31) 
==5663== by 0x414A19: DataHandler::loadFrame() (DataHandler.cpp:68) 
==5663== by 0x406680: main (main.cpp:58) 

답변

6

포인터를 저장하여 벡터에서 매트하지 마십시오.

이러한 것들은 smartpointers와 같이 내부적으로 참조되며, 포인터를 저장/복사하여 망가 뜨리고 있습니다. 스마트 포인터에 대한 포인터 벡터는 어쨌든 바보 같이 들릴 것입니다. 나는이 점에 유의합니다

+0

)

은 숙면 오늘 밤에 항목 당 몇 가지 추가 ~ 56 바이트 무역, 일반 vector<Mat>를 사용합니다. 그것이 내 기억 누출의 원인 일 수 있다고 생각하십니까? –

+0

확실히 !!!! – berak

+0

질문을 수정했습니다. 다른 많은 문제를 해결 했으니 까 고맙겠습니다.하지만 여전히 문제가 있습니다 :/ –