首页 > 解决方案 > 如何修复运行时错误 [SIGABRT] 断言失败

问题描述

当我尝试在我的程序中使用断言函数时,它会转储代码并给出运行时错误。谁能告诉我我的代码有什么问题?

#include <bits/stdc++.h>
using namespace std;

int main() {
    long long int a;
    cin>>a;
    while(a--)
    {
        long long int a,b;
        cin>>a>>b;
        long long int arr[a];
        long long int arr1[a];
        long long int z=b;
        long long int sum[z];
        for(int i=0;i<z;i++)
        {
            sum[i]=0;
        }
        for(int i=0;i<a;i++)
        {
            cin>>arr[i];
        }

        for(int i=0;i<a;i++)
        {
            cin>>arr1[i];
        }
        for(int i=0;i<a;i++)
        {
            assert(arr[i]>b);
            assert(arr[i]<1);
            assert(arr1[i]>50);
            assert(arr1[i]<0);
        }
        for(int i=1;i<=b;i++)
        {
            for(int j=0;j<a;j++)
            {
                if(arr[j]==i)
                {
                    sum[i-1]=sum[i-1]+arr1[j];
                }
            }
        }
        sort(sum,sum+z);
        long long int c[z]={0};
        long long int j=0;
        for(int i=0;i<z;i++)
        {
            if(sum[i]!=0)
            {
                c[j]=sum[i];
                j++;
            }
        }
        cout<<c[0];
    }
    return 0;
}

输入: 1 6 4 1 2 3 3 2 2 7 3 9 1 1 1

输出: prog: prog.cpp:30: int main(): Assertion `arr[i]>b' failed。

标签: c++runtime-errorsigabrt

解决方案


assert 的想法是如果不满足某些条件,则使用 SIGABRT 粉碎您的程序,因此,它完全按照它在这种情况下应该做的事情。

首先,我强烈建议你重新组织这段代码,因为它不可读,这使得理解错误变得更加困难 - 一眼就无法理解这段代码的作用。

其次,如果你在 linux 上工作,asserts 会导致 core dump,这是一个包含程序崩溃时的内存状态的文件。通过这个核心转储,您可以使用名为 GDB(GNU 调试器)的工具窥探程序的最后时刻。它不是最漂亮的,但它很强大。

另一种有效的方法是将打印(或日志)添加到您的代码中,这样您就可以看到发生了什么,以及为什么得到断言。

最后,assert 是一种工具,旨在记录您的代码的不变量,并确保只要该不变量不再正确(由于错误或滥用代码),程序将立即崩溃,将错误暴露为尽快。


推荐阅读