boost::shared_ptr
異常なコンストラクターがあります
template<class Y> shared_ptr(shared_ptr<Y> const & r, T * p);
これが何に役立つのか、私は少し困惑しています。基本的に と所有権を共有しますr
が、.get()
を返しp
ます。じゃない r.get()
!
これは、次のようなことができることを意味します。
int main() {
boost::shared_ptr<int> x(new int);
boost::shared_ptr<int> y(x, new int);
std::cout << x.get() << std::endl;
std::cout << y.get() << std::endl;
std::cout << x.use_count() << std::endl;
std::cout << y.use_count() << std::endl;
}
そして、あなたはこれを得るでしょう:
0x8c66008
0x8c66030
2
2
ポインタは別々ですが、どちらも ause_count
が 2 であると主張していることに注意してください (同じオブジェクトの所有権を共有しているため)。
したがって、int
所有者はまたはx
が存在する限り存在します。ドキュメントが正しいことを理解していれば、2番目のドキュメントは決して破壊されません。次のテストプログラムでこれを確認しました。x
y
int
struct T {
T() { std::cout << "T()" << std::endl; }
~T() { std::cout << "~T()" << std::endl; }
};
int main() {
boost::shared_ptr<T> x(new T);
boost::shared_ptr<T> y(x, new T);
std::cout << x.get() << std::endl;
std::cout << y.get() << std::endl;
std::cout << x.use_count() << std::endl;
std::cout << y.use_count() << std::endl;
}
これは(予想どおり)出力します:
T()
T()
0x96c2008
0x96c2030
2
2
~T()
では、あるポインターの所有権を共有するが、使用すると別のポインター (所有していない) のように機能する、この異常な構造の有用性は何ですか。