【Qt 专栏】Qt 程序一运行就崩溃和结束时崩溃的问题解决
QT中程序崩溃的原因解释
1. 空指针异常(Null Pointer Exception)(常见于结束时崩溃)
当我们调用一个空指针指向的方法或者成员变量时,程序会崩溃,因为空指针并没有对应的方法或成员变量。
2. 数组下标越界(Array Index Out of Bounds)
当我们访问数组的时候,如果使用了超出数组范围的下标,程序就会崩溃。
3. 内存泄漏(Memory Leaks)
如果程序中存在内存泄漏,也会导致程序异常结束。
内存泄漏指的是程序动态分配的堆空间没有被及时释放,导致程序的内存使用量不断增加。
4. 栈溢出(Stack Overflow)
如果一个函数递归调用过深,会导致栈溢出,从而使程序异常结束。
5. 计算错误(Computational Errors)
当我们进行不合法的计算时,程序也可能异常结束,例如除以0、对负数求平方根等。
6. 程序调用某些动态库,但是这些库缺失了。(常见于一运行就崩溃)
详细说说这种情况:
这种情况,往往在编译的时候没有任何错误,但是程序一运行,就会崩溃。
这主要是因为调用了动态库(动态库是程序运行时才加载的库)
程序调用一些模块(比如OpenCV, SeetaFace)的时候,需要额外包含头文件、库文件;
库文件分为两种:动态库、静态库。
头文件和静态库在pro指定中已经,例如下面:
INCLUDEPATH += E:\Qt_Opencv_Build\3-opencv_contrib\opencv-4.5.2\build-for-qt\install\include #OpenCV include
INCLUDEPATH += E:\Qt_Opencv_Build\5-seetaface2\st2_build_for_qt\sf2_install\include #seetaface2 include
LIBS += E:\Qt_Opencv_Build\3-opencv_contrib\opencv-4.5.2\build-for-qt\lib\libopencv_*.a #OpenCV lib
LIBS += E:\Qt_Opencv_Build\5-seetaface2\st2_build_for_qt\sf2_install\lib\libSeeta* #seetaface2 lib
但是动态库,是需要设置系统环境变量 PATH 的,
动态库通常在 bin 文件夹中(也有的可能在 lib 文件夹中), 以 Seetaface 的动态库为例,其路径为:
因此,应该将此路径添加进系统环境变量PATH中。避免程序调用动态库时,发现找不到,从而产生崩溃的现象:
如何编辑环境变量呢?请看另一篇文章——《windows编辑环境变量的打开方式》。
在实际开发中,程序异常结束可能还有其他的原因,例如操作系统资源不足、电脑关机等。
但以上几种原因是比较常见的,程序员应该尽可能地避免这些问题的出现,以保证程序的稳定性和可靠性。
补充:指针不能二次释放——常见于QT中程序结束时崩溃
背景:
我在MainWindow的析构函数中添加了两个指针的释放,但是在运行程序的过程中,点击“关闭”之后,会出现程序Crash的报错(正常应该是exit 0)
MainWindow::~MainWindow()
{
delete m_server;//加上 这两句出现错误,程序异常结束。
delete m_socket;//The process was ended forcefully.
delete ui;
}
报错如下:
解释:可能程序自己已经释放了,自己释放相当于第二次释放,因此会出错
解决方案:
直接注释掉。
附:C++程序可以delete 空指针,但不能 delete 已经释放的指针
原文:《C++delete空指针可以吗?》
完全可以 . . . .
很多人这样写程序,
if(pMyClass) //这里, pMyClass是指向某个类的指针 . .
{
delete pMyClass ;
}
他们往往先判断一下指针是否为空 , 如果不为空 , 说明没有被删除 , 于是清空这个指针 。
这样写不会出现大问题,但是没必要,
因为实际上delete 本身会自动检查对象是否为空 .如果为空 , 就不做操作 . . 所以直接用delete pMyClass 就可以了 . . .
而且,delete 之后的指针,也不会变为 NULL,最好的实践如下:
if(pMyClass) //这里, pMyClass是指向某个类的指针 . .
{
delete pMyClass ;
pMyClass = NULL; // 这句不能少
}
注意:
1. delete NULL 是没有问题的
char *p = NULL;
delete p;
2:delete栈上的空间是不行的
char *p = "1234";
delete p;
2. delete两次不行
char *p = new char;
delete p;
delete p; // 不能删除两次,第一次delete p之后,p的地址并不是空,同一块内存释放两次是有问题的
参考资料:
1.《C++删除空指针》链接:https://blog.csdn.net/qq_41786318/article/details/81943101
2.《Qt程序异常结束的原因》链接:https://blog.csdn.net/qq_45662289/article/details/129788900