C ++运算符重载导致分段错误

时间:2015-08-02 15:39:19

标签: c++11 segmentation-fault operator-overloading libstdc++ g++4.8

下面是给出分段错误的代码,我不知道是什么原因。在尝试重载^运算符时,我遇到了分段错误。

这是我的代码。

#include <iostream>
#include <algorithm>
using namespace std;

class bigint {

    public:

    char val[1000000];
    int msdindex;
    bool iszero;

    bigint( int i ) {
        if( i == 0 )
            iszero = true;
        else {
            iszero = false;
            msdindex = -1;
            while( i > 0 ) {
                msdindex++;
                val[ msdindex ] = i % 10;
                i /= 10;
            }
        }
    }

    bigint( const bigint& bi ) {
        msdindex = bi.msdindex;
        iszero = bi.iszero;
        for( int i = 0; i <= msdindex; i++ )
            val[i] = bi.val[i];
    }

};

bigint operator^( bigint k, int n ) {

    if( n == 1 )
        return bigint(k);

    bigint half = k^(n/2);

    return half;

}

int main()
{
    bigint bi = bigint( 999 );
    bigint di = bi ^ 4;
    return 0;
}

分段错误在重载函数中^我无能为力。 gdb说这个。

  

追踪(最近一次通话):     文件“/usr/share/gdb/auto-load/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.19-gdb.py”,第63行,       来自libstdcxx.v6.printers导入register_libstdcxx_printers   ImportError:没有名为'libstdcxx'的模块

     

编程接收信号SIGSEGV,分段故障。   运算符^(bigint,int)()

中的0x0000000000400749

请帮忙。

1 个答案:

答案 0 :(得分:1)

您的内存不足,因此您每次都会编程崩溃。将bigint中char的状态分配减少到较小的值可以正常工作。 或者使用动态内存分配,以防您需要巨大的char数组,这将解决您的问题。 希望这会有所帮助。

class bigint {

    public:

    char *val;//[1000000];
    int msdindex;
    bool iszero;

    bigint( int i ) {
        if( i == 0 )
            iszero = true;
        else {
            iszero = false;
            msdindex = -1;
            val = new char[1000000];
            while( i > 0 ) {
                msdindex++;
                val[ msdindex ] = i % 10;
                i /= 10;
            }
        }
    }

    bigint( const bigint& bi ) {
        msdindex = bi.msdindex;
        iszero = bi.iszero;
        val = new char[1000000];
        for( int i = 0; i <= msdindex; i++ )
            val[i] = bi.val[i];
    }

};

不要忘记为此编写析构函数来释放此动态分配的内存。欢呼声。