根据从业多年的经验,使用C/C++开发的应用程序发生了运行崩溃,其主要原因有几点:
- 指针操作不当
1.1 指针未初始化
一个指针在Debug下编译器自动将其初 始化为NULL,一块缓存同样在Debug下编译器会自动将该块缓存中的所有字节初始化为0
然而Release下则不会发生这样的事情,需要程序中有初始化的代码。
1.1.2 指针越界读写
这个错误几乎所有的开发人员都会犯,有个好办法可以避免:用模板类封装指针,重载+=和-=操作符,在里面判断是否越界。
1.1.3 指针用完释放后未置NULL
一个良好的习惯是在指针使用完毕并释放后,显示的将该指针值为NULL,如此避免了野指针的出现。 - 内存资源耗尽
2.1 动态申请的指针使用完毕后不释放,导致内存泄露。
2.2 容器(vector/list/map等)的旧的失效数据不及时清除,导致垃圾数据堆积。
2. 3 文件,套接字等内核对象使用完毕后不释放(关闭句柄),导致内核资源耗尽。 - 数据的同步问题
3.1 对一块数据读写时不进行互斥保护,导致多线程读写产生坏数据。
3.2 单线程下对于可递归重入的函数缺乏调用保护,导致数据读写错乱
3.3 多线程下读写非 volatile 关键字修饰的全局变量导致的数据同步问题。(Debug下不发生,Release下频繁发生) - 数据溢出
4.1 每种常规类型的数据都有范围,超出其范围将导致数据溢出,溢出后数据归零,如此会产生计算错误或分母为零的情况,造成崩溃。 - 堆栈溢出
5.1 堆栈溢出的现象虽不常见但绝对存在,函数内存在多个局部大尺寸结构体或Class对象,而且函数调用期间又产生了多个大尺寸局部临时对象,如此会导致堆栈溢出,返回地址被覆盖,运行崩溃。
还有其他会造成程序运行崩溃的情况,就不一一列举了,总之要确保程序安全高效稳定的运行,必须要有足够的经验和知识来支撑。## 程序运行崩溃