2010-10-25 123 views
0

我正在与gnump并且有一个功能,必须返回mpz_t。所以我必须使用原始指针来返回一个值。我为指针分配空间new,并将其作为我的函数中的参数发送。GMP和智能指针

我认为最好使用智能指针。但之前我没有和他们一起工作。我阅读手册,但仍不明白如何正确使用shared_ptr从函数返回变量。

shared_ptr<mpz_t> func() 
{ 
    mpz_t z; 
    mpz_init_set_str(z, "23423423423", 10); 

    shared_ptr<mpz_t> p /* Shall I allocate space with "new" or smth else?.. */ 

    return p; 
} 

我将不胜感激任何例子。

回答

5

在这种情况下使用共享指针不能帮助你。 mpz_t类型本身就像指针一样。这样的指针通过调用任何mpz_init _...函数来初始化。但是,您需要调用mpz_clear来释放由您使用的init函数分配的空间。

将指针存储在shared_ptr中没有您想要的效果。它确实记录了对mpz_t变量的引用次数,并且在没有更多引用时也会删除mpz_t变量。然而,这只能释放mpz_t变量本身,这是类似指针的。它不调用mpz_clear函数。

智能指针是非常有用的,但它们是为了引用类对象,而不是类似指针的变量。他们会照顾他们所引用对象的破坏。如果它们引用一个复杂的对象,这是有道理的,但如果它们引用了一个指针,则不是。

GNU MP提供了一个C++类接口。 (查找mpz_class)

shared_ptr<mpz_class> func() 
{ 
    shared_ptr<mpz_class> z(new mpz_class("23423423423", 10)); 
    return z; 
} 

如果需要一个mpz_t传递给其他功能,可以从共享指针获取它:

p->get_mpz_t() 

其中p是类型的shared_ptr <mpz_class>的。

1

,如果你想不复制其返回Z,这将是


shared_ptr func() 
{ 
    shared_ptr z(new mpz_t()); 
    mpz_init_set_str(*z, "23423423423", 10); 

    return z; 
}
1

虽然需要指针类型,但您可以创建一个将由智能指针调用的自定义删除程序。如果你想使用mpz_t而不是一个指针并在销毁时使用mpz_clear,你可以编写你的一些包装器来实现它,或者甚至可以自己实现它,尽管你不能直接使用shared_ptr,它需要一个指针。

或者,更可取的是,你可能会考虑使用GNU的C++接口,它使用mpz_class而不是mpz_t,我想象一下为你处理清理。