C++ unique_ptr

来源:互联网 发布:触发器 sql 编辑:程序博客网 时间:2024/06/05 09:10

        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,123cout << "---------------------------------" << 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

点击打开链接



0 0