Использование общих указателей в этом контексте вам не поможет. Сам тип 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 .