一、问题来源?这是什么?
首先这个错误提示是linux上,c/c++程序中linux上运行时出错的问题。
二、这样的崩溃不处理行不行?
首先,某些测试用例对这样的崩溃不处理是可以完全通过的。但是通常情况下。这种问题必须要处理。否则你的程序移植性很差。
而且你不知道什么时候就会崩溃。
三、什么样的问题会导致这样的崩溃?
网上一搜一大把,都说访问数组越界,巴拉巴拉。那么很多人都会把重心放在数组越界上。并且这种错误一般情况下很难发现。尤其是代码量很大很大,就会非常难以发现。
四、解决这个问题的正确步骤应该是什么?
解决方案:首先要了解这个问题是什么: 属于程序访问了非法的栈空间。
访问了非法的栈空间分几种情况。
1>:数组越界。
2>:临时变量已经释放了,但是还在访问这块内存。
关于第一点:数组越界,有两种,1:普通数组越界。主要是访问下标越界
2:字符串数组越界,是不是遗漏了字符串最后面的\0
#include <iostream>
using namespace std;
int main()
{
int a[3] = { 1, 2, 3};
cout << a[3] << endl; //下标越界。
char b[5] = {'c','h', 'i', 'n', 'a'};
int len = strlen(b); // 字符串没有结尾\0
}
如果你的代码根本没有用到数组,或者和字符串都已经确保\0结束了,Name就得考虑下面这种情况。
针对第二种情况访问已经释放了的栈空间。就更加隐蔽了。当然下面例子中都是比较简单的模型。在实际代码中,几十万行代码中查找到这种错误是很困难的。
#include <iostream>
using namespace std;
bool Init(int* p)
{
*p = 1;
return true;
}
int main()
{
int *p = NULL;
{
int a = 10;
p = &a;
}
bool bl = Init(p);//访问了非法的栈空间,【栈空间已经释放】
cout << *p << endl;
//上面小例子,部分编译器会正确输出结果,但是并不代表上述情况是正确的。
//是因为编译器还没有来得及完全释放临时变量,导致结果可能正确。
//但是实际项目中,系统非常复杂。内存的申请和释放非常的频繁。所以复杂的系统才更容易重现上述问题。
return 0;
}