读取不可访问内存时的ClC++运行时错误 我有一些C++代码,但我不知道什么。为了示例的目的,我们假设它是: //main.cpp #include<iostream> using namespace std; int T[100]; int main() { for(int i = 0; i < 100; ++i) T[i] = i; int x; cin>>x; cout<<T[x]<<endl; return 0; }
我正在通过cl/O2/nologo/EHsc main.cpp编译它,并通过main读取不可访问内存时的ClC++运行时错误 我有一些C++代码,但我不知道什么。为了示例的目的,我们假设它是: //main.cpp #include<iostream> using namespace std; int T[100]; int main() { for(int i = 0; i < 100; ++i) T[i] = i; int x; cin>>x; cout<<T[x]<<endl; return 0; },c++,runtime-error,cl,C++,Runtime Error,Cl,我正在通过cl/O2/nologo/EHsc main.cpp编译它,并通过main
然而,这也是一项在开发环境中比在生产环境中更有用的功能。如果您不能修改上述程序的源代码,请在“外部”环境shell中运行它,并获取返回值并根据0对其进行测试-任何其他值都会导致错误行为 验证这样的程序的输入数据也是很好的,因为您知道它无法处理这些数据,所以与其等待它崩溃,还可以防止它发生 若您可以修改程序,那个么简单的解决方案是使用类似的std::vector或std::deque,但重要的是使用at方法,而不是操作符[],因为at方法检查边界
#include<iostream>
#include<vector>
using namespace std;
std::vector<int> T(100);
int main()
{
for(int i = 0; i < 100; ++i)
T[i] = i;
int x;
cin>>x;
cout<<T.at(x)<<endl;
return 0;
}
如果将使用坏的越界参数调用at,则将抛出异常,您可以这样捕获:
try{
cin>>x;
cout<<T.at(x)<<endl;
}
catch(...)
{
cout << "exception while accessing vector's data" << endl;
}
可以使用std::vector或std::array,提供越界检查,如果在运行时发生,将抛出异常。您需要确保x在0到99之间,否则您的程序将具有未定义的行为。请不要评分,因为这是一个完全有效的问题,最重要的部分在POST末尾。我不能修改程序的源代码。就像我上面写的,程序打印随机数,在这种情况下返回0。同样在生产环境中,它也不能使我的应用程序慢很多。对于您描述的确切问题,我认为这包含了答案-如果内存分配给您的进程,通常您无法执行任何操作,如果你不被偷听的话,你也做不了什么。但是,如果这个应用程序使用STL,您可以链接到这个库的调试版本,这将使代码速度大大降低,但应该会有所帮助。如果您考虑CLAN/GCC构建,您也可以尝试AddressSanitizer,它有时会帮助解决这些问题。