【问题标题】:Throw in C++ triggers program message then crash抛出 C++ 触发程序消息然后崩溃
【发布时间】:2011-06-21 01:14:14
【问题描述】:

我调试了我的应用程序,代码在这段代码中的 throw 语句立即崩溃:

try
{
    char newbuff[8];
    if(strlen(cstr) > sizeof(newbuff))
    {
         throw BUFFER_TOO_SMALL;
    }
    if(strlen(cstr) == 0)
    {
         throw NO_CONTENT;
    }
    strcpy(newbuff, cstr); //Yeah yeah yeah, I know, I'm just learning
    ptr = newbuff;
}
catch(int errn)
{
     cout << "error: ";
     if(errn == BUFFER_TOO_SMALL)
     {
          cout << "storage buffer too small.\n";
          return 0;
     }
     if(errn == NO_CONTENT)
     {
          cout << "no content inside of buffer.\n";
          return 0;
     }
}

因此,在调试时,它就在 throw 语句上崩溃了。有趣的是,CLI(在本例中为“cmd.exe”)显示了这条消息(它不是由我放入其中,来自编译器或操作系统):

This application has requested the Runtime to terminate it in an unusual way. Please contact the application's support team for more information.

我现在更倾向于 C++,因为我以前只是用 C 编程。如您所知,现在我正在尝试管理 C++ 使用的 try-catch 异常处理系统。

【问题讨论】:

  • 您是否尝试在抛出 BUFFER_TO_SMALL 的函数的调用者中捕获异常?如果你没有捕捉到异常,程序就会崩溃。
  • 是的,catch 语句在代码中,我只是没有提供。捕获跟随尝试。 Try 包含上面的代码。
  • 您是否尝试过 catch (...) 以查看类型是否不匹配,因此您设置的 catch 没有捕获?
  • 上面的代码应该可以工作,假设常量是int's。
  • 我不认为任何人的答案都有效;我会尝试不同的编译器,请稍等。

标签: c++ windows exception throw


【解决方案1】:

您的if 语句看起来不正确:名称newbuff 表示一个指针,其大小在32 位系统上为4,在64 位系统上为8。哦,对了,在我发布您已编辑之后,您编写代码以将newbuff 的定义显示为一个数组。但无论如何。

如果没有处理程序,throw 可能会崩溃。在这种情况下,标准不要求堆栈被倒回(本地对象被破坏)。

似乎BUFFER_TOO_SMALL 是一个常数,可能是一个整数。你不应该抛出整数(除非你真的知道你在做什么)。抛出 std::exception 对象,例如std::runtime_error.

编辑:您更新的代码显示您正在捕获int。这意味着您的大写常量不是int。但建议仍然有效。

还有一个样式问题,使用 ALL UPPERCASE 作为常量。不。这是一种 Java 主义:在 C 和 C++ 中,按照惯例,所有大写字母都仅用于宏和宏。

干杯,

【讨论】:

  • 不同意常量的大写。这在 C 和 C++ 中很常见。
  • @AresAvatar:不,这不常见。请参阅 C++ 常见问题解答或 Bjarne Stroustrup 自己的常见问题解答。也许您在新手程序员的环境中也曾经历过这种常见的情况。
  • 对不起 Alf,但你错了,这并不常见,你的侮辱语气并不能改变这一事实。我在许多公司从事专业编程超过 25 年。每个人都使用大写字母表示 C 和 C++ 中的常量。
  • 我一直使用大写的常量。仅仅因为 Bjarne 这么说并不完全意味着社区会这样做!就像 MSDN 一样,这是一个 巨大 违反此“规则”的行为,msdn.microsoft.com/en-us/library/ms740668%28v=VS.85%29.aspx
  • @AresAvatar:完全同意 Alf 的观点。对除宏以外的任何内容使用大写标识符是NOT 常见的。事实上,因为宏不遵守范围边界(如其他标识符),使得代码很难使用/与其他代码集成(因此非常脆弱)。从 C 语言的早期开始,这基本上就是一个主食。
【解决方案2】:

似乎 newbuff 没有空终止符的空间。您应该将 newbuff[8] 的大小调整为 newbuff[9]。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-15
    • 1970-01-01
    • 2021-03-02
    • 2012-04-16
    • 2015-10-02
    • 1970-01-01
    相关资源
    最近更新 更多