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