2011-06-16 24 views
2
#include <iostream> 
#include <memory> 

class test 
{ 
    private: 
     int x , y; 
    public: 
     test(int a , int b):x(a),y(b){} 
     void fun() 
     { 
      std::cout<< x<<" "<<y<<" "<<std::endl; 
     } 
}; 

void show(std::auto_ptr<test> t1) 
{ 
    t1->fun(); 
} 

int main() 
{ 

    show(new test(3,4)); 

} 

我收到一個編譯錯誤,請告訴我這段代碼有什麼問題?提前致謝。當auto_ptr是它的參數時如何調用函數!

回答

0

詹姆斯解釋瞭如何解決這個問題

但auto_ptr的原因的設計,讓你不能做到這一點:。

show(new test(3,4)); 

是因爲這是一個壞主意。
即使這樣(如果允許):

show(std::auto_ptr<test>(new test(3,4))); 

將是一個壞主意。
所以你問爲什麼。

那在正常情況下沒什麼大不了的。
Bu當你有一個函數需要多個參數時會發生什麼。

show2(std::auto_ptr<test>(new test(3,4)), SomeObject()); 

現在的標準註冊就所有的參數都將調用(auto_ptr的甚至建設)前全面評估。但它並不保證評估順序,也不保證評估不會交錯。

因此有可能這樣的評價:

// Phsedu code for parameter evaluation 
    test*      tmp1 = new test(3,4); 
    SomeObject const&   tmp2 = SomeObject(); 
    std::auto_ptr<test> const& tmp3(tmp1); 
call(tmp3, tmp1) 

這個順序是不好的。因爲如果SomeObject的構造函數拋出一個異常,您將泄漏tmp1,因爲它尚未分配給std :: auto_ptr。

這就是我們設計auto_ptr的原因,您必須給它一個命名變量。

std::auto_ptr<test> tmp3(new test(3,4)); 
SomeObject   tmp1; 
call(tmp3, tmp1) 

現在,如果SomObject構造函數拋出測試對象將被整理。

+0

你是絕對正確的! – Alok 2011-06-17 02:51:34

3

無論何時您動態分配對象,您都應該創建一個名爲的智能指針,該智能指針立即取得該對象的所有權,然後使用該指定的智能指針。例如,

std::auto_ptr<test> ptr(new test(3, 4)); 
show(ptr); 

你不能直接傳遞給new test(3, 4)功能,因爲std::auto_ptr對象必須顯式構造;如果一個智能指針隱式地擁有一個對象的所有權,那將是相當意想不到的。

這就是說,這是相當不尋常的呢,因爲當你調用show(),該auto_ptr被複制,當auto_ptr被「複製」,原來失去所有權和副本收益的所有權(這樣,show()被調用後,你會發現這ptr不再具有對象的所有權

+1

+1。事實上,當函數退出時,你會發現對象被破壞,因爲't1'超出了範圍。 (另外,你可能會也可能不想給出理由或鏈接,解釋使用_named_智能指針的重要性。關於構造函數和異常,我記得......) – Nemo 2011-06-16 22:59:51

+0

謝謝你,我明白了。 – Alok 2011-06-16 23:19:18

相關問題