相关疑难解决方法(0)

安静的NaN和信号NaN有什么区别?

我读过关于浮点的内容,我知道NaN可能来自操作.但我无法完全理解这些概念是什么.有什么区别?

在C++编程期间可以生成哪一个?作为程序员,我可以编写一个程序来导致sNaN吗?

floating-point nan ieee-754

81
推荐指数
2
解决办法
2万
查看次数

为什么当d == 0时'd / = d'不抛出零除异常?

我不太明白为什么我不能除以零例外:

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

80
推荐指数
3
解决办法
5485
查看次数

从信号处理程序中抛出异常

我们有一个库,可以处理错误报告的许多方面.我的任务是将此库移植到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)

c++ signals exception

22
推荐指数
3
解决办法
2万
查看次数

Longjmp退出信号处理程序?

从问题:

在C中使用setjmp和longjmp是不错的编程习惯?

其中两条评论说:

"你不能在信号处理程序中抛出异常,但你可以安全地做一个longjmp - 只要你知道你在做什么. - Dietrich Epp 8月31日19:57 @Dietrich:+1你的评论.这是一个鲜为人知且完全不被重视的事实.在不使用信号处理程序的longjmp的情况下,有许多问题无法解决(令人讨厌的竞争条件).阻塞系统调用的异步中断是典型的例子."

我的印象是内核在遇到异常情况时调用信号处理程序(例如除以0).此外,如果您专门注册它们,它们只会被调用.

这似乎意味着(对我来说)它们不会通过您的正常代码调用.

继续这个想法...我理解的是setjmp和longjmp用于将堆栈折叠到先前的点和状态.我不明白在调用信号处理程序时如何折叠堆栈,因为它从内核调用作为一次性环境而不是从您自己的代码调用.从信号处理程序到堆栈的下一个东西是什么!?

c unix signals longjmp

16
推荐指数
2
解决办法
6224
查看次数

我无法捕获和处理浮点异常?

我尝试编写一个简单的程序来练习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)

c++

6
推荐指数
1
解决办法
2280
查看次数

除以零会导致Borland C++中的内存泄漏

我只是在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++ windows c++builder-6 borland-c++

5
推荐指数
1
解决办法
500
查看次数

如何在C++中捕获"任何"异常?

据我所知,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++中,如何找出导致什么异常的动作?

c++ exception

4
推荐指数
1
解决办法
3281
查看次数

C 处理信号 SIGFPE 并继续执行

我正在尝试处理一个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()函数内部执行所需的任何操作,然后继续循环的下一次迭代。

这也适用于需要处理的其他信号。任何帮助,将不胜感激。

c signals

4
推荐指数
2
解决办法
5529
查看次数

为什么我的UnhandledExceptionFilter没有被简单的除以零调用?

我使用以下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实际上似乎并没有被调用此示例中抛出的除零异常,否则我会期望显示"得到未处理的异常"日志消息.这是为什么?

c++ winapi exception unhandled-exception visual-c++

2
推荐指数
2
解决办法
3136
查看次数

结构RUNTIME_FUNCTION

我在IDA的RUNTIME_FUNCTION结构的.pdata段中找到了一个大数组。因此,在哪里可以找到信息:从它的编译,如何创建以及如何在C ++中使用信息。请给我书籍,或提供具有良好描述和教程的链接,以使用此结构来处理异常和消除异常。

c++ exception-handling stack-unwinding

1
推荐指数
2
解决办法
1936
查看次数