在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一旦退出範圍就會刪除指向的對象。 ?? !!
「在這一點上爲空」它的成員變量是如何得到更新的?這是你的答案。這是可能的(請參閱'shared_ptr'),但成本非零。這就是爲什麼至少有兩個智能指針類型:一個用於簡單的無開銷,一個用於共享開銷。 – GManNickG
'p.my_p'和'q.my_p'是兩個不同的變量,所以將其中一個設置爲NULL不會改變另一個。 –
hmm; @GManNickG @green燈籠我在這裏有點困惑。如果我只刪除my_p而不設置my_p = NULL,會發生什麼情況。因爲我沒有指定複製/賦值構造函數,所以編譯器會提供miranda拷貝,它將執行淺拷貝。之後'p.my_p'和'q.my_p'指向相同的信息位。現在,如果我'刪除p.my_p',我正在有效地刪除my_p指向的內容。所以'q.my_p'懸而未決,我同意這一點。但是當我的功能超出範圍時,它的左邊就懸而未決了。爲什麼不實施這個解決方案..? – thassan