【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

posted @ 2024-04-26 12:19  FBshark  阅读(3227)  评论(1编辑  收藏  举报