<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
1.裸指標直接初始化,但不能通過隱式轉換來構造
2.允許移動構造,也允許拷貝構造
3.通過make_shared構造
例:
#include <iostream> #include <memory> class Frame {}; int main() { std::shared_ptr<Frame> f(new Frame()); // 裸指標直接初始化 std::shared_ptr<Frame> f1 = new Frame(); // Error,explicit禁止隱式初始化 std::shared_ptr<Frame> f2(f); // 拷貝建構函式 std::shared_ptr<Frame> f3 = f; // 拷貝建構函式 f2 = f; // copy賦值運運算元過載 std::cout << f3.use_count() << " " << f3.unique() << std::endl; std::shared_ptr<Frame> f4(std::move(new Frame())); // 移動建構函式 std::shared_ptr<Frame> f5 = std::move(new Frame()); // Error,explicit禁止隱式初始化 std::shared_ptr<Frame> f6(std::move(f4)); // 移動建構函式 std::shared_ptr<Frame> f7 = std::move(f6); // 移動建構函式 std::cout << f7.use_count() << " " << f7.unique() << std::endl; std::shared_ptr<Frame[]> f8(new Frame[10]()); // Error,管理動態陣列時,需要指定刪除器 std::shared_ptr<Frame> f9(new Frame[10](), std::default_delete<Frame[]>()); auto f10 = std::make_shared<Frame>(); // std::make_shared來建立 return 0; }
注意:
1.儘量避免將一個裸指標傳遞給std::shared_ptr的建構函式,常用的替代手法是使用std::make_shared。如果必須將一個裸指標傳遞給shared_ptr的建構函式,就直接傳遞new運運算元的結果,而非傳遞一個裸指標變數。
2.不要將this指標返回給shared_ptr。當希望將this指標託管給shared_ptr時,類需要繼承自std::enable_shared_from_this,並且從shared_from_this()中獲得shared_ptr指標。
3.不要使用相同的原始指標作為實參來建立多個shared_ptr物件,具體原因見下面講的shared_ptr記憶體模型。可以使用拷貝構造或者直接使用過載運運算元=進行操作
例:
#include <iostream> #include <memory> class Frame {}; int main() { Frame* f1 = new Frame(); std::shared_ptr<Frame> f2(f1); std::shared_ptr<Frame> f3(f1); // Error std::shared_ptr<Frame> f4(f2); auto f5 = f2; return 0; }
s.get():返回shared_ptr中儲存的裸指標;
s.reset(…):重置shared_ptr;
auto s = make_shared<int>(100); s.reset(new int (200));
s.use_count()
:返回shared_ptr的強參照計數;
s.unique()
:若use_count()為1,返回true,否則返回false。
具體範例:
auto pointer = std::make_shared<int>(10); auto pointer2 = pointer; // 參照計數+1 auto pointer3 = pointer; // 參照計數+1 int *p = pointer.get(); // 這樣不會增加參照計數 std::cout << "pointer.use_count() = " << pointer.use_count() << std::endl; // 3 std::cout << "pointer2.use_count() = " << pointer2.use_count() << std::endl; // 3 std::cout << "pointer3.use_count() = " << pointer3.use_count() << std::endl; // 3 pointer2.reset(); std::cout << "reset pointer2:" << std::endl; std::cout << "pointer.use_count() = " << pointer.use_count() << std::endl; // 2 std::cout << "pointer2.use_count() = " << pointer2.use_count() << std::endl; // 0, pointer2 已 reset std::cout << "pointer3.use_count() = " << pointer3.use_count() << std::endl; // 2 pointer3.reset(); std::cout << "reset pointer3:" << std::endl; std::cout << "pointer.use_count() = " << pointer.use_count() << std::endl; // 1 std::cout << "pointer2.use_count() = " << pointer2.use_count() << std::endl; // 0 std::cout << "pointer3.use_count() = " << pointer3.use_count() << std::endl; // 0, pointer3 已 reset
由圖可以看出,shared_ptr包含了一個指向物件的指標和一個指向控制塊的指標。每一個由shared_ptr管理的物件都有一個控制塊,它除了包含強參照計數、弱參照計數之外,還包含了自定義刪除器的副本和分配器的副本以及其他附加資料。
控制塊的建立規則
因此,更好的解決方式是儘量避免使用裸指標作為共用指標的實參,而是使用make_shared,此外,make_shared相比直接new還具有以下好處
make_shared與new方式記憶體分佈對比圖:
所有比較運運算元都會呼叫共用指標內部封裝的原始指標的比較運運算元;支援==、!=、<、<=、>、>=;同型別的共用指標才能使用比較運運算元
shared_ptr<int> sp_n1 = make_shared<int>(1); shared_ptr<int> sp_n2 = make_shared<int>(2); shared_ptr<int> sp_nu; shared_ptr<double> sp_d1 = make_shared<double>(1); bool bN1LtN2 = sp_n1 < sp_n2; //true bool bN1GtNu = sp_n1 > sp_nu; //true bool bNuEqNu = sp_nu == sp_nu; //true bool bN2GtD1 = sp_d1 < sp_n2; //編譯錯誤
本篇文章就到這裡了,希望能夠給你帶來幫助,也希望您能夠多多關注it145.com的更多內容!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45