gpt4 book ai didi

c++ - 调试 glibc free() : invalid pointer

转载 作者:行者123 更新时间:2023-11-30 05:27:52 31 4
gpt4 key购买 nike

我正在尝试调试最终抛出的代码

*** 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会检测到这一点。

关于c++ - 调试 glibc free() : invalid pointer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37082460/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com