首頁  >  文章  >  後端開發  >  儘管類型擦除,“std::shared_ptr”如何保留物件銷毀行為?

儘管類型擦除,“std::shared_ptr”如何保留物件銷毀行為?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-10-31 17:40:01593瀏覽

How Does `std::shared_ptr` Preserve Object Destruction Behavior Despite Type Erasure?

std::shared_ptr;功能揭秘

調查圍繞著 std::shared_ptr 令人費解的功能。最初被認為難以置信,但在以下程式碼片段中觀察到的行為引起了懷疑:

<code class="cpp">#include <memory>
#include <iostream>
#include <vector>

int main() {
  std::cout << "At begin of main.\ncreating std::vector<std::shared_ptr<void>>" << std::endl;
  std::vector<std::shared_ptr<void>> v;
  {
    std::cout << "Creating test" << std::endl;
    v.push_back(std::shared_ptr<test>(new test()));
    std::cout << "Leaving scope" << std::endl;
  }
  std::cout << "Leaving main" << std::endl;
  return 0;
}

程式碼顯示以下輸出:

At begin of main.
creating std::vector<std::shared_ptr<void>>
Creating test
Test created
Leaving scope
Leaving main
Test destroyed</code>

理解類型擦除

此行為的關鍵在於執行的類型擦除std::shared_ptr。當初始化一個新實例時,std::shared_ptr 儲存一個內部刪除器函數。預設情況下,函數在銷毀shared_ptr 時呼叫delete 運算子。此機制可確保在適當的時間呼叫所指向物件的析構函數,無論shared_ptr 的類型為何。

強制轉換的結果

強制轉換std ::shared_ptr;到std::shared_ptr;不會改變儲存的刪除器函數,它仍然引用原始的測試析構函數。因此,當shared_ptr被銷毀,仍然呼叫正確的析構函數,從而產生預期的行為。

標準合規性和未來影響

關於此技術的保證行為,至關重要請注意,std::shared_ptr 的內部實現可能因不同的編譯器和平台而異。雖然類型擦除一直是shared_ptrs的一個基本方面,但未來對其實現的更改可能會影響所描述的功能。

因此,不建議僅依賴此行為,並且應在生產程式碼中避免這種做法。相反,替代方法(例如使用 std::function 或自訂刪除器類別)更加健壯,並且將在各種實作中提供一致的行為。

以上是儘管類型擦除,“std::shared_ptr”如何保留物件銷毀行為?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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