shared_ptr

どうなるのかなーと思ったら問題なくデストラクタが呼ばれるみたい。
ほへー。

[ソース]

#include <memory>
#include <iostream>

struct X{
    X(int value) : value(value){}
    ~X(){
        std::cout << "delete X" << std::endl;
    }

    int value;
};


struct Y{
    ~Y(){
        std::cout << "delete Y" << std::endl;
    }
};


int
main(){
    std::shared_ptr<void> p = std::make_shared<X>(42);

    auto value = static_cast<X*>(p.get())->value;
    std::cout << value << std::endl;

    {
        std::shared_ptr<void> p = std::make_shared<Y>();
    }

    return 0;
}

[出力]

42
delete Y
delete X


上記のソースコードだと元の型にアクセスする場合、明示的にキャストしているんだけど他に手段とかあるのかしら。

[追記]

std::static_pointer_cast というヘルパ関数が用意されているのでそれを使えばいいみたいです。

static_assert(std::is_same<decltype(std::static_pointer_cast<X>(p)), std::shared_ptr<X>>{}, "");

auto value = std::static_pointer_cast<X>(p)->value;
std::cout << value << std::endl;
// => 42