异常类型
目录
一、传递给函数的参数无效。
1.1产生错误的原因
传递给函数的参数无效错误,通常是因为某个函数接收到了一个不符合预期的参数(例如空指针、超出范围的值、错误的类型等)。
1.2解决办法
1)查看错误信息,通过查看调用堆栈,找到是哪个函数抛出了异常。
2)检查函数,了解函数中参数类型、范围和约束条件。
3)调试代码
- 在调用函数的地方设置断点。
- 检查参数值,查看传递给函数的参数值是否正确。
- 单步执行,观察参数是如何生成和传递的。
4)使用异常处理,使用try-catch块捕获异常
5) 检查内存管理,确保指针已正确初始化,避免使用已释放的内存。
1.3例子
这是有错误的代码
#include <vector>
using namespace std;
class Solution {
public:
int countArrays(vector<int>& original, vector<vector<int>>& bounds) {
vector<int>s;
int n = original.size();
for (int i = 1; i < n; i++) {
int num = original[i] - original[i - 1];
s.push_back(num);
}
int h = 0;
int flag, count = 0;
int cal;
for (int j = bounds[0][0]; j <= bounds[0][1]; j++) {
flag = 1;
cal = j;
for (int k = 1; k < n; k++) {
cal= cal+ s[h];
h++;
if (cal<bounds[k][0] || cal>bounds[k][1]) {
flag = 0;
}
}
if (flag == 1) {
count++;
}
if(flag==0) {
break;
}
}
return count;
}
};
需要改正的的地方:
1. 变量 h
的使用问题
-
你应该在每次外层循环开始时重置
h
的值。
2. flag
的初始化问题
-
flag
应该在内层循环开始时初始化为1
,而不是在外层循环中初始化。
3. count
的计算问题
-
你在
flag == 0
时直接break
,这会导致你无法继续检查其他可能的j
值。你应该继续检查其他j
值,而不是直接跳出循环。
4. 边界条件检查
-
你需要确保
original
和bounds
的大小一致,并且在bounds
中的每个区间都是有效的。
//这是之前刷算法题时写的(垃圾)代码,在发生传递给函数的参数无效时,我就去问ai,上面的提示问题就是ai给出的解决办法,如果自己找不到问题出在哪里,你们也可以去问ai.
二、访问容器时索引超出范围
2.1解决办法
-
检查索引范围:确保索引在
0
到size()-1之间。 -
使用安全的访问方法:如at().
-
使用迭代器或范围循环:避免直接使用索引。
//我认为这个还是很好理解的,所以就没写很多。
三、内存分配失败
3.2错误原因
new malloc calloc
系统内存不足;内存碎片化严重,无法分配连续的大块内存;程序存在内存泄漏,导致可用内存逐渐减少。如C++中new操作符,C中malloc 或 calloc出现异常 。
3.1解决办法
1)检查系统内存,确保系统有足够的可用内存;关闭不必要的程序以释放内存。
下面的图片表示我们修改内存空间的方法,具体栈空间大小设置要根据实际而定。
2)优化内存使用:减少内存需求,释放未使用的内存,及时释放不再需要的内存(如使用delete或free)
3) 检查内存泄漏:使用工具检测内存泄漏,如果是C++,可以用Valgrind、AddressSanitizer。
4)使用更大的地址空间:在 64 位系统上运行程序,以利用更大的地址空间,确保编译器生成 64 位代码。
//通过以上方法,可以有效解决大部分内存分配失败的问题。同时也这里提醒下,要小心野指针。
四、程序逻辑错误
4.1解决办法
1)调试:设断点,单步执行。
2) 打印调试信息
……
//其实这是程序员基本要求,就是大脑跟着程序走一遍,所以这里就不赘述了。