0

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

我认为最好使用智能指针。但我之前没有和他们合作过。我阅读了手册,但仍然无法理解如何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;
}

如果有任何例子,我将不胜感激。

4

3 回答 3

6

在这种情况下使用共享指针对您没有帮助。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>。

于 2010-10-25T22:27:57.073 回答
1

如果您想在不复制的情况下返回 z,它将是


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

    return z;
}
于 2010-10-25T21:43:45.343 回答
1

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

或者,更可取的是,您实际上可能会考虑使用使用 mpz_class 而不是 mpz_t 的 GNU 的 C++ 接口,我想会为您处理清理工作。

于 2010-10-26T00:14:14.343 回答