插入C++会触发程序消息,然后崩溃
Throw in C++ triggers program message then crash
我调试了我的应用程序,代码在以下代码中的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]。
相关文章:
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- boost::进程间消息队列引发错误
- 在线编译器中的分段C++没有打印消息
- 如何声明特征矩阵,然后通过嵌套循环初始化它
- C++错误消息*成员参考.**初学者*
- 在createdialog创建的窗口中捕获用于编辑控件的OnMouseMove消息
- 这是我尝试让用户将值输入到数组中.然后将其隐藏为大量的星号
- boost::asio如何生成多个协同程序,然后加入它们
- 要与"if constexpr"一起使用的编译时消息(在预处理器之后)
- 如何将图像传输到c++(dll)中的缓冲区,然后在c#的缓冲区中读/写
- 在std::thread中,joinable()然后join()线程安全吗
- 如何通过参数抛出错误消息
- 从服务器传输到客户端的消息不会出现
- ROS2 动态消息模板
- C++:如何读取分离变量,然后读取向量
- 将加密消息从 php 发送到 C++ 应用程序,然后使用 CryptoPP 进行解密
- 加载在JSBN中创建的RSA公钥,然后加密消息
- Qt websocket发送消息并等待响应,然后再进入下一个方法
- 在容器中保存消息,然后将所有消息发送到后端
- 插入C++会触发程序消息,然后崩溃