1. 程式人生 > 其它 >智慧指標可以放到容器中麼_C++11新特性6 - 容器與帶指標屬性的類

智慧指標可以放到容器中麼_C++11新特性6 - 容器與帶指標屬性的類

技術標籤:智慧指標可以放到容器中麼

e01c98c3e018e42e63324b25b6cabd34.png

本文主要介紹 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 Class​youtu.be