push_back导致sgfault

时间:2012-07-12 09:10:25

标签: c++ std

我有一个由我制作的类ArbDouble,它基本上是mpfr_t

的包装器

该问题的相关部分是

class ArbDouble
{
private:
    mpfr_t value;

public:
    explicit ArbDouble(long double value_, unsigned long precision) {
        mpfr_init2(value, precision);
        mpfr_set_d(value, value_, MPFR_RNDN);
    }
    explicit ArbDouble(long int value_, unsigned long precision) {
        mpfr_init2(value, precision);
        mpfr_set_ui(value, value_, MPFR_RNDN);
    }

    ArbDouble(){
        mpfr_init(value);
    }

    ArbDouble(unsigned long precision) {
        mpfr_init2(value,precision);
    }
    ArbDouble(const ArbDouble& other) {
        mpfr_init2(value, other.getPrecision());
        mpfr_set(value, other.value, MPFR_RNDN);
    }

    ArbDouble(const mpfr_t& other) {
        mpfr_init2(value, mpfr_get_prec(other));
        mpfr_set(value, other, MPFR_RNDN);
    }

    explicit ArbDouble(char* other, unsigned long precision) {
        mpfr_init2(value, precision);
        mpfr_set_str(value, other, 10, MPFR_RNDN);
    }

    ~ArbDouble() {
        mpfr_clear(value);
    }

    inline unsigned long getPrecision() const
    {
        return mpfr_get_prec(value);
    }
    inline ArbDouble& operator=(const ArbDouble &other)
    {
        mpfr_set_prec(value, other.getPrecision());
        mpfr_set(value, other.value, MPFR_RNDN);
        return *this;
    }
}

现在,我正在使用std :: vector来存储这些值的矩阵,例如

std::vector<ArbDouble> temp;
temp.push_back(ArbDouble((long int)0,64)); // calling "ArbDouble(long int value_, unsigned long precision)"

std::vector<std::vector<ArbDouble> > currentOrbit;
currentOrbit.push_back(temp);

这会导致linux机器上的段错误,但不会导致mac机器上的段错误。

gdb给出的错误是:

Program received signal SIGSEGV, Segmentation fault.
0x00000000004069fe in std::vector<std::vector<ArbDouble, std::allocator<ArbDouble> >, std::allocator<std::vector<ArbDouble, std::allocator<ArbDouble> > > >::push_back (this=0xb5daafcc938b13f6, __x=std::vector of length 1, capacity 1 = {...})
    at /usr/include/c++/4.5/bits/stl_vector.h:743
743     if (this->_M_impl._M_finish != this->_M_impl._M_end_of_storage)

有谁知道问题出在哪里?我不是一个非常优秀的班级设计师,所以,我的猜测是,它有一个缺陷。对它的任何建议都非常受欢迎!!!

1 个答案:

答案 0 :(得分:3)

这是堆/堆栈损坏的典型情况。你可能在某个地方有一个你正在写的数组,但是它的边​​界之外。这样做,您正在更改随机附近对象的变量(在本例中为vector),因此更改了其他库中的奇怪错误(在本例中为std)。

由于你的所有类都调用了这个mpfr_函数集,很可能是错误存在(除非你没有显示其他代码)。你可以尝试调试并以任何你喜欢的方式找出问题,但也许最简单的解决方案是使用valgrind

valgrind --leak-check=full ./your_program --args --to --your program