我有以下簡單的代碼,而我還沒有發現其中的智能指針用於這個簡單的例子一個線程,而是複製對象:智能指針 - 的unique_ptr的堆棧分配的變量
int main()
{
int i = 1;
std::unique_ptr<int> p1(&i);
*p1 = 2;
return 0;
}
這當指針超出範圍時導致_BLOCK_TYPE_IS_INVALID
。如果我撥打p1.release()
,代碼工作正常,我不會收到此錯誤。我認爲這樣的指針足夠聰明來處理懸掛指針?
另一種方法是,如果我有我的一份,這並沒有給上述錯誤:
std::unique_ptr<int> p1(new int(i));
什麼是這裏使用智能指針,在這裏我不想執行本地的優勢複製?
如果我是使用原始指針:
int i = 1;
int *p1 = &i;
*p1 = 2;
我不會得到一個錯誤,即使我不代碼:
p1 = nullptr;
謝謝你們,這是有道理的。另外,爲什麼我不能只做p1 = nullptr而不是p1.release()。我明白,release()返回一個指向託管對象的指針並釋放所有權。 p1.reset()取代了被管理對象,所以對於棧分配的變量來說這是非法的。但爲什麼p1 = nullptr編譯,但引發異常? – c0der
使用['=']指定'unique_ptr'(http://www.cplusplus.com/reference/memory/unique_ptr/operator=/)基本上與調用['reset'](http:// www .cplusplus.com/reference/memory/unique_ptr/reset /),並銷燬先前保存的指針。使用['release'](http://www.cplusplus.com/reference/memory/unique_ptr/release/)會放棄指針的所有權,而不會破壞它。 – qxz
'p1 = nullptr'是一個賦值,p1應該清理它的指針然後保存nullptr。這是業主需要做的。 'p1.release()'是放棄它的「所有權」並將它的控制指針返回給其他人,而不再管理,所以它不會清理它。 –