读取不可访问内存时的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; }

读取不可访问内存时的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

我正在通过cl/O2/nologo/EHsc main.cpp编译它,并通过main具体来说,我在ASP.NETMVC应用程序中通过C中的Process类以编程方式运行所有这些。我想检查程序是否引发了异常/读取而不是保留内存等。

这是一项仅用于开发目的的功能,还是也用于生产环境

仅在出于开发目的的情况下,您可以尝试在一些运行时检查工具(如Valgrind/Dr Memory)下运行应用程序,或者更改编译方式以包含运行时调试检查,这在所述情况下不一定有效,但在许多其他情况下会有所帮助。请记住,这将使您的应用程序慢得多,因此应仅用于正在开发的应用程序

当涉及到生产环境时,我不知道有什么方法可以做你想做的事情——一般来说,如果你运气好的话,在读取可用内存时,你只能依靠操作系统分段错误——如果你不这样做,它将起作用

对于例外情况,我不能100%肯定我理解你的意思-这就是为什么程序终止的原因吗?在这种情况下,在正常终止的情况下,您可能会得到崩溃应用程序的核心转储。我假设您有返回代码,您可以稍后检查它,以获取崩溃原因,或者也可能尝试恢复一些数据。有关如何在Windows上收集转储的说明,您可以查看:


然而,这也是一项在开发环境中比在生产环境中更有用的功能。

如果您不能修改上述程序的源代码,请在“外部”环境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,它有时会帮助解决这些问题。