【问题标题】:C++ operator overloading causing segmentation faultC++ 运算符重载导致分段错误
【发布时间】:2015-08-02 15:39:18
【问题描述】:

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

这是我的代码。

#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 这么说的。

Traceback(最近一次调用最后一次): 文件“/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,分段错误。 0x0000000000400749 in operator^(bigint, int) ()

请帮忙。

【问题讨论】:

  • 请使用 -g 编译,使用 gdb,然后调试,看看你的问题是什么。我怀疑它不是在运行普通的 C++ 程序,而是某种 python 嵌入,但你没有透露。您的运算符是否在普通旧 C++ 程序中的普通旧 C++ 主方法中工作?
  • 你能用更小的val试试吗?在您的版本中,每个 bigint 对象占用 1MB 空间。 并且您的运算符按值取一个。 And 创建一个内部副本。也许您的堆栈空间不足?

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


【解决方案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];
    }

};

不要忘记为此编写析构函数以释放动态分配的内存。干杯。

【讨论】:

  • “不要忘记为此编写析构函数以释放...” 一个复制构造函数一个复制赋值运算符。或者只使用已经封装了所有这些的std::vector
  • @Angew w.r.t.这个问题,复制构造函数已经写好了,我看不到复制赋值运算符的使用。顺便说一句,矢量当然是更好的选择。
  • 对不起,错过了复制 ctor(不知何故 :-/ )。尽管如此,如果没有相应的分配操作(“三规则”),该课程将被破坏。
猜你喜欢
  • 1970-01-01
  • 2013-11-21
  • 1970-01-01
  • 1970-01-01
  • 2014-11-30
  • 2013-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多