2013-10-03 49 views
1

boost::scoped_ptr中,表示「它提供了一個基本的」資源獲取是初始化「工具,沒有共享所有權或所有權轉讓語義。」這是通過一些不可複製的機制完成的。爲什麼boost :: scoped_ptr或std :: unique_ptr不可複製?

我的問題是爲什麼沒有共享所有權的要求?

這裏是我的意思是:

template <typename T> 
class my_scoped_ptr 
{ 
public: 
    // constructor implemented not shown here 
    // operator*() implemented not shown here 
    // operator -> implemented not shown here 
    ~my_scoped_ptr() 
    { 
    delete my_p; 
    my_p = NULL; 
    } 
private: 
    T * my_p; 
}; 


void foo() 
{ 
    my_scoped_ptr<someclass> p (new someclass()); 
    my_scoped_ptr<someclass> q (p); // both p & q point to same my_p object 
    // may be an exception is raised 
} 

現在好了,無論是否引發異常的MY_P將被刪除。 因此,當代碼離開foo的作用域時...調用my_scope_ptr p析構函數,刪除my_p並將my_p設置爲null。 現在再次調用my_scope_ptr q析構函數刪除my_p,此時爲空。 它似乎在銷燬時我可以不在乎剩下的複製指針是否指向一個有效的對象。

那麼,爲什麼我需要關心my_scoped_ptr不應該可複製?我沒有看到ptr是可複製的,如果ptr一旦退出範圍就會刪除指向的對象。 ?? !!

+2

「在這一點上爲空」它的成員變量是如何得到更新的?這是你的答案。這是可能的(請參閱'shared_ptr'),但成本非零。這就是爲什麼至少有兩個智能指針類型:一個用於簡單的無開銷,一個用於共享開銷。 – GManNickG

+1

'p.my_p'和'q.my_p'是兩個不同的變量,所以將其中一個設置爲NULL不會改變另一個。 –

+0

hmm; @GManNickG @green燈籠我在這裏有點困惑。如果我只刪除my_p而不設置my_p = NULL,會發生什麼情況。因爲我沒有指定複製/賦值構造函數,所以編譯器會提供miranda拷貝,它將執行淺拷貝。之後'p.my_p'和'q.my_p'指向相同的信息位。現在,如果我'刪除p.my_p',我正在有效地刪除my_p指向的內容。所以'q.my_p'懸而未決,我同意這一點。但是當我的功能超出範圍時,它的左邊就懸而未決了。爲什麼不實施這個解決方案..? – thassan

回答

1
void foo() 
{ 
    my_scoped_ptr<someclass> p (new someclass()); 
    my_scoped_ptr<someclass> q (p); // both p & q point to same my_p object 
    // may be an exception is raised 
} 

作爲函數結束(返回或擲)和q超出範圍,對於q析構函數會deletesomeclass對象。然後緊接着,p超出範圍,其析構函數將再次deletesomeclass對象。

delete這個指針無效兩次! (除非new恰好在此期間再次返回)。 [如果任何C++實現試圖使其有效,它將不得不將所有具有相同值的原始指針(這就是shared_ptr的原始指針)鏈接在一起,否則要記錄哪些地址已被刪除,這意味着他們仍然在使用某種內存,而沒有真正釋放。 ]

相關問題