~shared_ptr();
shared_ptr
オブジェクトの破棄
自身のみが所有権を持つ場合に、リソースを解放する。
効果
他のshared_ptr
オブジェクトとリソースを共有している場合(use_count() > 1
)、効果なし。
自身のみがshared_ptr
オブジェクトのリソースを所有している場合、コンストラクタ、代入演算子、reset()
メンバ関数で代入されたY*
型のポインタp
について、
- デリータを持っていれば
d(p)
でリソースを解放する。 - デリータを持っていなければ、
delete p
でリソースを解放する。
p
がT*
型ではなくY*
型であることに注意。これにより、shared_ptr<void>
に対して任意の型Y
のオブジェクトへのポインタを代入したとしても、Y
型のデストラクタが正しく実行される。
備考
実際にはshared_ptr
は参照カウントで実装されるため、他のshared_ptr
オブジェクトと所有権を共有している状態でデストラクタが実行された場合、参照カウントを1
減らす、ということを行う。
例
#include <iostream>
#include <memory>
struct X {
~X()
{
std::cout << "X dtor" << std::endl;
}
};
struct Y {
~Y()
{
std::cout << "Y dtor" << std::endl;
}
};
int main()
{
std::shared_ptr<void> p(new X());
std::cout << 0 << std::endl;
p.reset(new Y()); // Xが破棄される
std::cout << 1 << std::endl;
} // Yが破棄される
xxxxxxxxxx
#include <iostream>
#include <memory>
struct X {
~X()
{
std::cout << "X dtor" << std::endl;
}
};
struct Y {
~Y()
{
std::cout << "Y dtor" << std::endl;
}
};
int main()
{
std::shared_ptr<void> p(new X());
std::cout << 0 << std::endl;
p.reset(new Y()); // Xが破棄される
std::cout << 1 << std::endl;
} // Yが破棄される
出力
0
X dtor
1
Y dtor