首頁 >後端開發 >C++ >`make_shared` 與 `shared_ptr`:為什麼更有效率且異常安全?

`make_shared` 與 `shared_ptr`:為什麼更有效率且異常安全?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-12-14 12:19:11494瀏覽

`make_shared` vs. `shared_ptr`: Why is One More Efficient and Exception-Safe?

make_shared和標準shared_ptr的差別

為什麼make_shared更有效率?

了解std::make_shared與標準shared_ptr相比的效率,我們來一步步考察他們的構建過程

使用標準的shared_ptr構造函數:

std::shared_ptr<Object> p2(new Object("foo"));
  • 執行Object("foo")的堆分配。
  • 使用原始資料建立新的 std::shared_ptr 控制塊指標。

使用 std::make_shared:

std::shared_ptr<Object> p1 = std::make_shared<Object>("foo");
  • std::shared_ptr 控制區塊和物件實例的單堆分配是已執行。

異常安全

在標準的shared_ptr構造方法中,如果在構造Object期間拋出異常,則不會執行任何清理,留下懸空記憶體。然而,std::make_shared 保證建構的 Object 和控制塊是單一分配的一部分,如果拋出異常,將會被清理。

std::make_shared 的缺點

  • 與使用標準的shared_ptr構造函數相比,增加了記憶體保留:由於std::make_shared執行單一分配,指向的記憶體無法被分配,指向的記憶體無法被分配釋放,直到控制塊不再使用。指向物件的弱指標可以使控制區塊保持活動狀態,從而可能導致延長記憶體保留時間。

以上是`make_shared` 與 `shared_ptr`:為什麼更有效率且異常安全?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn