如何用auto_ptr做为函数的参数进行传递
auto_ptr跟指針的原理是一樣的,只不過在使用會自動釋放內存。但是在函數中作為auto_ptr參數使用時,一定要注意控制權的轉移問題。
void testptrAddNumber(MCMDTLog* mmcLog) {mmcLog->addNumber(); }void func(auto_ptr<int>& ap) {cout << *ap << endl; }void func11(int& ap) {cout << ap << endl; } void func33(const auto_ptr<int>& ap) {cout << *ap << endl; } int main() {auto_ptr<int> ap(new int(1));func(ap);cout << *ap << endl;func11(*ap.get());cout << *ap << endl;func22(ap);cout << *ap << endl;func33(ap);cout << *ap << endl; }以上三種寫法中void func(auto_ptr<int>& ap)以及void func11(int& ap)都能正確的打印出指針的數值,但是void func22(auto_ptr<int> ap)函數調用后,程序會直接崩潰,
主要原因就是指針控制權的轉移問題,當我們把auto_otr<int> ap作為參數傳遞給func22(auto_ptr<int>)時,指針ap的控制權已經轉移到func22()函數中,當該函數運行結束后指針ap就自動釋放了,當調用完funcc22函數后,執行cout<<*ap<<endl; 時程序直接崩潰。
但是函數的參數可以是auto_ptr<classT>& 類型,當傳遞auto_ptr的引用的時候,有的時候會傳遞所有權,有的時候不會,所以永遠不要這樣做。
所以安全辦法是使用const 引用方法
const auto_ptr<classT>& 實現的是不需要傳遞所有權。這個特性主要應用在模板上,當使用auto_ptr實例化對象的時候不會出現問題。所以const auto_ptr<classT>&的意思是不能轉移所有權,而不是不能更改數據,這里和c++信息是不一樣的,還是少使用好一些。
?auto_ptr當作類的成員變量可以避免,當類在構造的時候出現異常,這樣如果內存被分配了是不會被釋放的,因為如果構造沒有完成是不會調用析構函數的,這個時候就沒有辦法來釋放申請的資源了。可以使用auto_ptr來避免這樣的事情發生,如果不想在類種轉換所有權,可以使用const來修飾。
總結
以上是生活随笔為你收集整理的如何用auto_ptr做为函数的参数进行传递的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c++中虚函数和纯虚函数定义
- 下一篇: lammps