智慧指標可以放到容器中麼_C++11新特性6 - 容器與帶指標屬性的類
阿新 • • 發佈:2020-12-07
技術標籤:智慧指標可以放到容器中麼
本文主要介紹 C++ 中使用容器和擁有指標作為屬性的類容易遇到的問題,以及 C++11 新的解決思路
在 C++03 中使用帶指標屬性的類
假如我們定義了這樣一個類
class
我們希望把這個類放到 vector
裡面,於是寫出了一段看上去似乎沒問題,但事實上會崩潰的程式碼
int
為了避免這個問題,在 C++03 中,常見的解決方法是給 Person 新增一個拷貝建構函式
Person
然而,使用這種方法時,"Bob" 被多餘地構造和釋放了一次,造成了浪費
C++11 的解決方法
C++11 中,解決這個問題最簡單的方法是,使用 emplace_back
push_back
,讓容器自己來構造物件
int
C++11 中,各種容器的插入,都實現了 emplace 版本
然而,如果我們一定要使用 push_back
,注意到 Person("Bob")
是個右值,由於 C++11 過載了右值版本的 push_back(T&&)
,我們給 Person
新增移動建構函式
Person
這樣,push_back
內部只會發生兩次指標賦值操作,而不是重新構造一個字串
那麼,使用智慧指標能不能解決這個問題呢?答案是可以的,兩種解決方法
// 1. 使用 shared_ptr
要注意的是, 如果使用 shared_ptr
pName
指向的字串事實上是共享的;如果使用 unique_ptr
,則 Person
是不可拷貝只可移動的
本文主要翻譯自 Bo Qian 的 YouTube 視訊
C++ 11: Resource Managing Classyoutu.be