1

私が作成したクラス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)

問題がどこにあるのか誰か知っていますか?私はあまり優秀なクラスデザイナーではないので、どこかに欠陥があると思います。それへの提案は大歓迎です!!!

4

1 に答える 1

3

これは、ヒープ/スタックの破損の典型的なケースです。あなたはおそらくあなたが書いているどこかに配列を持っていますが、その境界の外にあります。そうすることで、ランダムな近くのオブジェクト(この場合はvector)の変数を変更しているため、他のライブラリ(この場合std)の内部で奇妙なエラーが発生します。

クラスが行うのはこのmpfr_関数のセットを呼び出すことだけなので、おそらくエラーがあります(表示していない他のコードがない限り)。デバッグを試みて、好きな方法で問題を見つけることができますが、おそらく最も簡単な解決策はvalgrindを使用することです:

valgrind --leak-check=full ./your_program --args --to --your program
于 2012-07-12T09:57:20.740 に答える