【发布时间】: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