unique_ptr 不共享它的指针。它无法复制到其他 unique_ptr,无法通过值传递到函数,也无法用于需要副本的任何标准模板库 (STL) 算法。只能移动unique_ptr。这意味着,内存资源所有权将转移到另一 unique_ptr,并且原始 unique_ptr 不再拥有此资源。我们建议你将对象限制为由一个所有者所有,因为多个所有权会使程序逻辑变得复杂。因此,当需要智能指针用于纯 C++ 对象时,可使用 unique_ptr,而当构造 unique_ptr 时,可使用make_unique Helper 函数。
unique_ptr 在 STL 的 <memory> 标头中定义。它与原始指针一样有效,并可用于 STL 容器。将 unique_ptr 实例添加到 STL 容器很有效,因为通过unique_ptr 的移动构造函数,不再需要进行复制操作。
#include "stdafx.h"
#include <iostream>
#include <string>
#include <memory>
using namespace std;
class Song
{
public:
Song(std::string strArtist, std::string strTitle) : artist(strArtist), title(strTitle)
{
}
Song()
{
}
std::string GetArtist() { return artist; };
std::string GetTitle() { return title; };
private:
std::string artist;
std::string title;
};
unique_ptr<Song> SongFactory(const std::string& artist, const std::string& title)
{
return make_unique<Song>(artist,title);
}
void MakeSongs()
{
auto song = make_unique<Song>("jz","123");
cout << "---------------------------------" << endl;
cout << song->GetArtist() << endl;
cout << song->GetTitle() << endl;
unique_ptr<Song> song2 = std::move(song);//调用move后 song为空 song2 指向了jz,123
cout << "---------------------------------" << endl;
cout << song2->GetArtist() << endl;
cout << song2->GetTitle() << endl;
cout << "---------------------------------" << endl;
if (song != nullptr)
{
cout << song->GetArtist() << endl;
cout << song->GetTitle() << endl;
}
else
{
cout << "song is nullptr" << endl;
}
auto song3 = SongFactory("cyw", "111");
cout << "---------------------------------" << endl;
if (song3 != nullptr)
{
cout << song3->GetArtist() << endl;
cout << song3->GetTitle() << endl;
}
auto song4 = std::move(song3);
cout << "---------------------------------" << endl;
if (song4 != nullptr)
{
cout << song4->GetArtist() << endl;
cout << song4->GetTitle() << endl;
}
}
int main()
{
MakeSongs();
return 0;
}
shared_ptr
unique_ptr