make_shared (<memory>)
建立並傳回 shared_ptr,它會指向使用預設配置器從零個或多個引數建構的配置物件。 配置並建構指定類別的物件和 shared_ptr 來管理共用的物件擁有權,並傳回 shared_ptr。
template<class Type, class... Types> shared_ptr<Type> make_shared( Types&&... _Args );
參數
參數 |
描述 |
---|---|
_Args |
零或多個建構函式引數。 函式會根據所提供的引數推斷要叫用的建構函式多載。 |
屬性值/傳回值
傳回指向所配置並建構之物件的 shared_ptr。
備註
使用 make_shared 做為建立物件和 shared_ptr 的一個簡單且更有效率的方式,並藉以同時管理物件的共用存取權。 語意上來說,這兩個陳述式是相等的:
auto sp = std::shared_ptr<Example>(new Example(argument));
auto msp = std::make_shared<Example>(argument);
但是,第一個陳述式會產生兩個配置,而若 Example 物件配置成功之後,shared_ptr 配置失敗,則未命名的 Example 物件會遭到洩露。 使用 make_shared 的陳述式比較簡單,因為這樣只會使用一個函式呼叫。 這樣會更有效率,因為程式庫可以讓物件和智慧型指標進行單一配置。 這樣會更迅速,並會減少記憶體分散的情形,且絕不會發生其中一個配置出現例外但其他配置未出現例外的情形。 改善參考物件的程式碼位置,並更新智慧型指標中的參考計數,便能夠提升效能。
如果您不需要物件的共用存取權,請考慮使用 make_unique。 如果您需要為物件指定自訂的配置器,請使用 allocate_shared。 如果您的物件需要自訂刪除者,則您無法使用 make_shared,因為您無法將刪除者做為引數傳遞。
下列範例示範如何透過叫用特定的建構函式多載來建立共用的類型指標。
範例
// stl_make_shared.cpp
// Compile by using: cl /W4 /EHsc stl_make_shared.cpp
#include <iostream>
#include <string>
#include <memory>
#include <vector>
class Song {
public:
std::wstring title_;
std::wstring artist_;
Song(std::wstring title, std::wstring artist) : title_(title), artist_(artist) {}
Song(std::wstring title) : title_(title), artist_(L"Unknown") {}
};
void CreateSharedPointers() {
// Okay, but less efficient to have separate allocations for
// Song object and shared_ptr control block.
auto song = new Song(L"Ode to Joy", L"Beethoven");
std::shared_ptr<Song> sp0(song);
// Use make_shared function when possible. Memory for control block
// and Song object are allocated in the same call:
auto sp1 = std::make_shared<Song>(L"Yesterday", L"The Beatles");
auto sp2 = std::make_shared<Song>(L"Blackbird", L"The Beatles");
// make_shared infers which constructor to use based on the arguments.
auto sp3 = std::make_shared<Song>(L"Greensleeves");
// The playlist vector makes copies of the shared_ptr pointers.
std::vector<std::shared_ptr<Song>> playlist;
playlist.push_back(sp0);
playlist.push_back(sp1);
playlist.push_back(sp2);
playlist.push_back(sp3);
playlist.push_back(sp1);
playlist.push_back(sp2);
for (auto&& sp : playlist) {
std::wcout << L"Playing " << sp->title_ <<
L" by " << sp->artist_ << L", use count: " <<
sp.use_count() << std::endl;
}
}
int main() {
CreateSharedPointers();
}
該範例會產生以下輸出:
需求
標頭: <memory>
命名空間: std