0

我有以下代码用于从缓冲区数组中提取字符串。它工作正常。但是,长度变量是在运行时确定的,因此如果超出范围,就会发生异常。当然,可以轻松调整代码以检查长度变量(相对于偏移变量)是否在边界内。虽然我很好奇为什么以下代码不起作用,因为异常似乎通过 try-catch 语句(并被调试器捕获)。

try
{
    string value(&buffer[offset], length);
    // ...
}
catch (exception& e)
{
    // ...
}
catch (...)
{
    // ...
}

在 Windows 7 64 位上运行,MSVCR 编译。

4

3 回答 3

5

buffer越界访问数组是未定义的行为。在这种情况下,不需要抛出 C++ 异常。尝试在 try 块之外实例化字符串,您将确定是否引发了异常。

于 2013-02-12T10:49:26.847 回答
1

我认为“异常”一词让您感到困惑。当我们谈论catch可以捕获的异常时,我们并不是指一般计算机科学意义上的“异常”。我们特别指的是throw操作引发的 C++ 异常。

你没有抛出异常的代码,你为什么希望捕获一个?如果你想在这种情况下抛出异常,你必须编写代码来做到这一点。

有时我看到程序员希望能够捕捉到,例如,除以零。虽然这是一般计算机科学意义上的异常,但它不是 C++ 异常,除非您有一些代码在除以零时创建 C++ 异常并抛出它。

于 2013-02-12T10:54:25.590 回答
1

您的程序可能会导致fault由于访问系统知道对您的进程无效的内存位置,例如取消引用 NULL 指针(总是错误)或超出堆中变量的边界(并不总是错误,取决于在页面边界上)。这些faults是由 CPU 检测到的,并且是一种不同于 C++ 中可以使用 try/catch 捕获的异常的机制,它们是语言的一部分,由编译器和语言运行时库实现。

在您的情况下,由于您使用的是 MSVC,因此您可以访问允许您同时捕获 __try 和 __except 工具的语言扩展,您可以在此处阅读有关 MSVC try-except 语句的更多信息。

于 2013-02-12T10:59:13.010 回答