Я пытаюсь отладить код, который в конечном итоге выдает
*** glibc detected *** ./build/smonitor: free(): invalid pointer:
Это сложно, потому что я не пользуюсь бесплатным … Я видел другие SO-посты, в которых есть примеры, повторяющие проблему. Мне нужна помощь по отладке. Во-первых, я C / C ++ n00b, так что мои навыки работы с указателями находятся в стадии разработки, но я не занимаюсь динамическим распределением памяти (я думаю).
Я начинаю писать свое собственное приложение для обеспечения безопасности, в котором я делаю снимки с камер и записываю их в общий ресурс NFS, в итоге у меня будет отображение снимка каждой камеры. Прямо сейчас я беру снимки с 1 камеры и прокручиваю их через окно дисплея (используя opencv). Я могу работать некоторое время (~ час), прежде чем получить дамп ядра. Я создаю поток для запуска окна, я должен зацикливаться, пока мой флаг запуска не будет установлен в false, а затем я вызываю cvReleaseImage .. Я понятия не имею, почему это терпит неудачу, любое руководство очень ценится!
// will be replaced with camera X filename on NFS share
std::string generate_filename()
{
static const char alphanum[] =
"0123456789""ABCDEFGHIJKLMNOPQRSTUVWXYZ""abcdefghijklmnopqrstuvwxyz";
std::string filename = "";
std::stringstream ss;
for (int i = 0; i < 10; i++)
{
ss << alphanum[rand() % (sizeof(alphanum) - 1)];
}
ss << ".jpg";
printf("Generated filename: %s\n", ss.str().c_str());
return ss.str();
}
std::string generate_file_path()
{
std::stringstream ss;
ss << CAPTURES_PATH << generate_filename();
return ss.str();
}void capture_photo(std::string& filepath)
{
time_t now;
time_t end;
double seconds;
bool cancelCapture = false;
int count = 0;
CvCapture* capture = cvCreateCameraCapture(0);
printf(“Opened camera capture\n");
IplImage* frame;
while(1)
{
frame = cvQueryFrame(capture);
if (!frame)
{
fprintf(stderr, "Could not read frame from video stream\n\n");
} else
{
cvShowImage(WINDOW, frame);
cvWaitKey(100);
if (get_snapshot_enabled()) // simulate delay between snapshots
{
filepath = generate_file_path();
printf("Saving image\n");
cvSaveImage(filepath.c_str(), frame);
break;
}
}
}
printf("Ending camera capture\n");
cvReleaseCapture(&capture);
}
void* manage_window(void* arg)
{
time_t now;
time_t end;
double seconds = 0;
double stateSec;
int i = 0;
int rem = 0;
IplImage* images[10];
time_t lastUpdate;
time_t tDiff; // time diff
cvNamedWindow(WINDOW, CV_WINDOW_FREERATIO);
cvSetWindowProperty(WINDOW, CV_WND_PROP_FULLSCREEN, CV_WINDOW_FULLSCREEN);
std::string filepath;
time(&now);
int lastPos = 0;
while (1)
{
if (get_snapshot_enabled())
{
write_console_log("Going to capture photo\n");
// camera was selected
filepath = generate_file_path();
printf("Generated filepath: %s\n", filepath.c_str());
capture_photo(filepath);
if (!filepath.empty())
{
printf("Received filepath: %s\n", filepath.c_str());
time(&now);
images[lastPos] = cvLoadImage(filepath.c_str());
cvShowImage(WINDOW, images[lastPos]);
cvWaitKey(100);
if (lastPos == 10) lastPos = 0;
else lastPos++;
}
}
time(&end);
seconds = difftime(end, now);
if (seconds >= 5)
{
cvShowImage(WINDOW, images[ i % 10])
cvWaitKey(100);
i++;
time(&now);
}
// check if we're running
if (!get_running())
{
// log some error we're not running...
write_logs("Window thread exiting, not running...");
break;
}
}
for (i=0; i < 10; i++)
cvReleaseImage(&images[i]);
pthread_exit(NULL);
}
В void* manage_window(void* arg)
есть линии
IplImage* images[10];
а также
images[lastPos] = cvLoadImage(filepath.c_str());
if (lastPos == 10) lastPos = 0;
else lastPos++;
где lastPos
может быть увеличено до 10, что приводит к
images[10] = cvLoadImage(filepath.c_str());
недопустимая запись за конец массива. Я думаю что-то вроде Valgrind обнаружил бы это.
Других решений пока нет …