ホームページ >バックエンド開発 >C++ >`std::shared_ptr` は型の消去にもかかわらずオブジェクトの破棄動作をどのように保持するのでしょうか?

`std::shared_ptr` は型の消去にもかかわらずオブジェクトの破棄動作をどのように保持するのでしょうか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-10-31 17:40:01686ブラウズ

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;
}</code>

このコードの出力は次のとおりです。

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

型消去について理解する

この動作の鍵は、によって実行される型の消去にあります。 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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。