负面分母使GMP崩溃?

时间:2013-08-09 11:21:26

标签: c++ gmp

#include <gmpxx.h>

int main() {
    mpq_class a("1/-2");
    mpq_class b("1/-3");
    mpq_class c = a + b;
    printf("%s\n", c.get_str().c_str());
}

根据GMP手册,当无效表示字符串传递给构造函数时,应该引发异常。但是,在这种情况下,GMP不会。

此外,请尝试下面的代码,这会导致Segfault:

#include <gmpxx.h>

class Container {
    public:
        mpq_class rat;
        Container(mpq_class _rat) : rat(_rat) {}
};

int main() {
    mpq_class a("1/-3");
    Container *c = new Container(a);
}

这是一个错误吗? GMP是众所周知的,我无法相信它很容易崩溃。

1 个答案:

答案 0 :(得分:1)

您误解了手册,有关理性的C ++界面部分开始:

  

在以下所有构造函数中,如果给出一个分数,那么它应该是规范形式,或者如果没有,则调用`mpq_class :: canonicalize'。

这意味着如果你传入一个可以解析但不是规范形式的分数,那么必须在其上调用canonicalize

  

如果字符串不是有效的理由,则抛出“std :: invalid_argument”异常。

指的是根本无法解析字符串的情况。

可以说,文件可以更明确。