ホームページ  >  記事  >  バックエンド開発  >  シャットダウン時の任意のクリーンアップに対して std::shared_ptr はどのように機能しますか?

シャットダウン時の任意のクリーンアップに対して std::shared_ptr はどのように機能しますか?

Susan Sarandon
Susan Sarandonオリジナル
2024-10-30 14:34:11369ブラウズ

How does std::shared_ptr<void> はシャットダウン時の任意のクリーンアップのために機能しますか? 
シャットダウン時の任意のクリーンアップのために動作しますか? " />

std::shared_ptr が機能する理由

期待に反して、std::shared_ptr

型消去

shared_ptr が作成されると、所有されているポインターがカプセル化されます。この関数は通常、デフォルトで delete を呼び出しますが、shared_ptr が破棄されると、ストアド デリータが呼び出され、オブジェクトのクリーンアップがトリガーされます。

型の消去を理解するには、次のようにします。 std::function を使用した次の簡略化された例を考えてみましょう。

template 
void delete_deleter(void *p) {
    delete static_cast(p);
}

template 
class my_unique_ptr {
public:
    my_unique_ptr(T *p, void(*deleter)(void *p) = &delete_deleter) 
        : p(p), deleter(deleter) 
    {}

    ~my_unique_ptr() {
        deleter(p);
    }

private:
    T *p;
    void(*deleter)(void *);
};

int main() {
    my_unique_ptr p(new double);
}

ここで、my_unique_ptr は、タイプ固有の削除関数を格納し、正しいことが保証されます。デストラクタはクリーンアップ中に呼び出されます。

std::shared_ptr および Type Erasure

共有ポインタも type Erasure を使用します。別のファイルからshared_ptrをコピーまたはデフォルトで構築する場合、デリータ情報は保持されます。これは、shared_ptr がshared_ptr から構築されます。は、shared_ptr にキャストした場合でも、適切なデストラクターを呼び出すために必要な知識を維持します。

C 標準によれば、この動作は保証されています。実装では、この機能を壊すような方法で std::shared_ptr の内部を変更することはできません。したがって、 std::shared_ptr を使用すると、任意のクリーンアップは合法的で信頼できる手法であるためです。

以上がシャットダウン時の任意のクリーンアップに対して std::shared_ptr はどのように機能しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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