Why smart pointer?
當我們拿到一個Foo* ptr 時...
1. 你其實不知道它是單一物件還是 array.
2. 你不知道該怎麼銷毀它.
a. delete ? delete[] ? ->Release()? Finalize()?
3. 保證(考慮所有路線可能後)剛好 delete 一次.
4. 你不知道這個指標是否還有效...
…from Effective Modern C++
4.
Smart pointer!
● C++11引入三種 smart pointer 來管理資源.
● #include <memory>
● unique_ptr: for exclusive-ownership.
● share_ptr: for shared-ownership.
● weak_ptr: if pointers that can dangle.
std::unique_ptr 用法
// 不接受隱式轉換成raw pointer (Compiler Error!)
unique_ptr<string> up = new string("");
string* p = up;
// 如果你真的要取得 raw pointer…
string* p = up.get(); //後果自行負責
建立 std::shared_ptr
// 傳入raw_pointer
shared_ptr<string> sp( new string("nico") );
// 呼叫 make_shared function (Recommend!)
// make_shared is more efficient.
auto sp = make_shared<string>( "nico" );
20.
std::shared_ptr 用法
auto sp= make_shared<string>( "nico" );
cout << (*sp)[ 0 ]; // print 'n'
sp->replace(0, 1, 'N'); // "Nico"
string* p = sp.get(); // get raw pointer
if ( sp ) { … }
if ( sp != nullptr ) { … }
if ( sp == nullptr ) { … }
21.
std::shared_ptr 可以分享持有權
auto sp= make_shared< QImage >( "icon.png" );
auto sp2( sp ); // via copy constructor
auto sp3 = sp; // via assignment
DoSomething( sp ); // pass as parameter
sp.reset(); // 釋放所有權
sp2.reset( new QImage ); // 改持有另一個 raw ptr