2010-10-25 120 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,我想象一下爲你處理清理。