QT编程常见崩溃问题总结

一 主程序事件循环函数崩溃 :

a.exec()处崩溃

该处崩溃一般调试的时候显示的堆栈信息停止的位置都是QT的dll库。我们的代码中只给出了a.exec()崩溃。

原因一:
子线程中更改界面上控件。在Qt事件循环中一般只有主线程可以用来改变某一个显示控件的状态。子线程想要改变界面时可以给主程序发信号。

原因二:
在事件循环中,有部分控件访问的地址越界
例如:

	QPixmap q_pixmap;
	//my_frame.data 是一块连续的内存空间,存放自定义图像数据。该类型创建的QImage数据为浅拷贝
	QImage q_image(static_cast<uchar*>(my_frame.data), width, height, QImage::Format_Grayscale8);
	//pix_image 内部数据指针指向my_frame.data 所在地址。pix_image 只要不对图片进行更改就不会进行真正的深拷贝复制。
	pix_image = pix_image.fromImage(img_image, Qt::ImageConversionFlag::NoFormatConversion);
	QLabel label;
	label.setPixmap(pix_image);

当自定义的分配的那一块图像缓冲区被释放时,QT程序因为label上的图片数据指针被释放,指向了无效数据空间。该控件可能有权限访问也可能没有,就会造成随机崩溃。提现在代码上就是主程序事件循环上崩溃。