插入C++会触发程序消息,然后崩溃

Throw in C++ triggers program message then crash

本文关键字:消息 然后 崩溃 程序 C++ 插入      更新时间:2023-10-16

我调试了我的应用程序,代码在以下代码中的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异常处理系统。

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

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

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

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

还有一个样式问题,使用全大写表示常量。不要。这是Java主义:在C和C++中,按照惯例,所有大写字母都只用于宏和宏。

干杯&hth。,

看起来newbuff没有空终止符的空间。您应该将newbuff[8]调整为newbuff[9]。