我读过关于浮点的内容,我知道NaN可能来自操作.但我无法完全理解这些概念是什么.有什么区别?
在C++编程期间可以生成哪一个?作为程序员,我可以编写一个程序来导致sNaN吗?
我不太明白为什么我不能除以零例外:
int d = 0;
d /= d;
Run Code Online (Sandbox Code Playgroud)
我本来希望得到除以零的除法运算,但是反而d == 1。
为什么在什么时候不d /= d将被零除d == 0?
c++ division divide-by-zero compiler-optimization undefined-behavior
我们有一个库,可以处理错误报告的许多方面.我的任务是将此库移植到Linux.当我的小测试套件运行时,其中一个测试失败了.测试的简化版本如下所示.
// Compiler: 4.1.1 20070105 RedHat 4.1.1-52
// Output: Terminate called after throwing an instance of 'int' abort
#include <iostream>
#include <csignal>
using namespace std;
void catch_signal(int signalNumber)
{
signal(SIGINT, SIG_DFL);
throw(signalNumber);
}
int test_signal()
{
signal(SIGINT, catch_signal);
try
{
raise(SIGINT);
}
catch (int &z)
{
cerr << "Caught exception: " << z << endl;
}
return 0;
}
int main()
{
try
{
test_signal();
}
catch (int &z)
{
cerr << "Caught unexpected exception: " << z << endl; …Run Code Online (Sandbox Code Playgroud) 从问题:
其中两条评论说:
"你不能在信号处理程序中抛出异常,但你可以安全地做一个longjmp - 只要你知道你在做什么. - Dietrich Epp 8月31日19:57 @Dietrich:+1你的评论.这是一个鲜为人知且完全不被重视的事实.在不使用信号处理程序的longjmp的情况下,有许多问题无法解决(令人讨厌的竞争条件).阻塞系统调用的异步中断是典型的例子."
我的印象是内核在遇到异常情况时调用信号处理程序(例如除以0).此外,如果您专门注册它们,它们只会被调用.
这似乎意味着(对我来说)它们不会通过您的正常代码调用.
继续这个想法...我理解的是setjmp和longjmp用于将堆栈折叠到先前的点和状态.我不明白在调用信号处理程序时如何折叠堆栈,因为它从内核调用作为一次性环境而不是从您自己的代码调用.从信号处理程序到堆栈的下一个东西是什么!?
我尝试编写一个简单的程序来练习ExpectionC++,但我无法捕获和处理浮点异常?
这是我的代码。
#include <iostream>
#include <string>
#include <exception>
using namespace std;
int main(int argc, char **argv) {
int num_1[] = {0, 2, 4, 6, 8}, num_2[] = {3, 2, 1, 0, -1};
for(int i = 0; i < sizeof(num_1) / sizeof(num_1[0]); i++) {
try {
int result = num_1[i] / num_2[i];
printf("%d / %d = %d\n", num_1[i], num_2[i], result);
} catch(exception &e) {
cout << e.what() << endl;
cout << "something is wrong." << endl;
continue;
}
} …Run Code Online (Sandbox Code Playgroud) 我只是在Borland C++ Builder Version 6中运行以下代码;
for (int i = 0; i < 40000; i++)
{
try {
__int64 n = 0;
__int64 r = 1 / n;
}
catch (Exception& e) {}
}
Run Code Online (Sandbox Code Playgroud)
在运行这个循环时,我在任务管理器(Memory列)中看到它正在泄漏内存.知道为什么吗?
我在项目中计算模块时遇到内存泄漏,当我尝试除以零并且在打了几个小时后在内存泄漏的地方,我意识到它在上述简单循环中泄漏了内存.在项目中没有发现任何问题.
据我所知,c ++中的所有异常最终都会扩展exception.在Java世界中,Exception e无论Exception的类型如何,catch 都会起作用.这是如何在C++中完成的?
为什么没有捕获此片段异常?
try{
int z = 34/0;
cout << "This line should not appear" << endl;
} catch (exception e) {
cout << "An error has occurred: " << e.what(); // Not executed
}
Run Code Online (Sandbox Code Playgroud)
另外,在C++中,如何找出导致什么异常的动作?
我正在尝试处理一个SIGFPE信号,但我的程序只是崩溃或永远运行。我必须使用,signal()而不是像sigaction().
所以在我的代码中,我有:
#include <stdio.h>
#include <signal.h>
void handler(int signum)
{
// Do stuff here then return to execution below
}
int main()
{
signal(SIGFPE, handler);
int i, j;
for(i = 0; i < 10; i++)
{
// Call signal handler for SIGFPE
j = i / 0;
}
printf("After for loop");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
基本上,每次除以 0 时,我都想进入处理程序。它应该在handler()函数内部执行所需的任何操作,然后继续循环的下一次迭代。
这也适用于需要处理的其他信号。任何帮助,将不胜感激。
我使用以下MSVC++控制台应用程序代码(在Windows 8.1,Release,Win32上运行)尝试将顶级异常返回给我:
#include "stdafx.h"
#include <Windows.h>
#include <iostream>
using namespace std;
LONG WINAPI UnhandledExceptionFilter(PEXCEPTION_POINTERS exception)
{
printf("Got an unhandled exception.");
return EXCEPTION_CONTINUE_SEARCH;
}
int _tmain(int argc, _TCHAR* argv[])
{
SetUnhandledExceptionFilter(UnhandledExceptionFilter);
int a = 0;
int b = 0;
int c = a / b;
cin.get();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我UnhandledExceptionFilter实际上似乎并没有被调用此示例中抛出的除零异常,否则我会期望显示"得到未处理的异常"日志消息.这是为什么?
我在IDA的RUNTIME_FUNCTION结构的.pdata段中找到了一个大数组。因此,在哪里可以找到信息:从它的编译,如何创建以及如何在C ++中使用信息。请给我书籍,或提供具有良好描述和教程的链接,以使用此结构来处理异常和消除异常。
c++ ×7
exception ×3
signals ×3
c ×2
borland-c++ ×1
c++builder-6 ×1
division ×1
ieee-754 ×1
longjmp ×1
nan ×1
unix ×1
visual-c++ ×1
winapi ×1
windows ×1