扔进C ++触发程序消息然后崩溃

时间:2011-06-21 01:14:14

标签: c++ windows exception throw

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

2 个答案:

答案 0 :(得分:0)

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

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

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

修改:您的更新代码显示您正在捕捉int。这意味着您的大写常量不是int。但无论如何,建议仍然存在。

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

干杯&amp;第h。,

答案 1 :(得分:0)

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