#include <iostream>
#include <boost/shared_ptr.hpp>
class implementation
{
public:
~implementation() { std::cout <<"destroying implementation\n"; }
void do_something() { std::cout << "did something\n"; }
};
void test()
{
boost::shared_ptr<implementation> sp1(new implementation());
std::cout<<"The Sample now has "<<sp1.use_count()<<" references\n";
boost::shared_ptr<implementation> sp2 = sp1;
std::cout<<"The Sample now has "<<sp2.use_count()<<" references\n";
sp1.reset();
std::cout<<"After Reset sp1. The Sample now has "<<sp2.use_count()<<" references\n";
sp2.reset();
std::cout<<"After Reset sp2.\n";
}
int main()
{
test();
}
実行結果は以下です。
$ ./a.out
The Sample now has 1 references
The Sample now has 2 references
After Reset sp1. The Sample now has 1 references
destroying implementation
After Reset sp2.
上記のコードを確認してください。私にとって最初に不明なことは、以下の文が何を意味するかということです。sp1 はポインタですか?機能?または関数へのポインタ?とnew implementation()
はどういう意味ですか? sp1()?の引数は?
boost::shared_ptr<implementation> sp1(new implementation());
2 番目の質問は、とdestroying implementation
の結果として与えられるです。しかし、がコメントアウトされている場合、結果は次のようになります。sp1.reset()
sp2.reset()
sp1.reset()
$ ./a.out
The Sample now has 1 references
The Sample now has 2 references
After Reset sp1. The Sample now has 2 references
After Reset sp2.
destroying implementation
のみをコメントアウトするsp2.reset()
と、結果は次のようになります。
$ ./a.out
The Sample now has 1 references
The Sample now has 2 references
After Reset sp1. The Sample now has 1 references
After Reset sp2.
destroying implementation
sp1.reset()
つまり、両方を呼び出しsp2.reset()
て shared_ptr を解放する必要はありません。