TR1ちょっとやってみた@shared_ptrその2

実はboostまともに使った事が無かったんで、
循環参照( ゚Д゚)ハァ?って感じでした。


という事でどっかからサンプル引っ張ってきてやってみた。

#include 
#include // for std::tr1::shared_ptr

using namespace std::tr1;

class Hoge
{
int _val;
public:
shared_ptr _spYour;

Hoge(int val) : _val(val)
{
std::cout << "Created hoge[" << _val << "]." << std::endl;
}

~Hoge()
{
std::cout << "Destroyed hoge[" << _val << "]." << std::endl;
}
};


int main()
{
shared_ptr spHoge0(new Hoge(0)); // ++Hoge0 == 1
{
shared_ptr spHoge1(new Hoge(1)); // ++Hoge1 == 1

spHoge0->_spYour = spHoge1; // ++Hoge1 == 2
spHoge1->_spYour = spHoge0; // ++Hoge0 == 2 ... この文が無ければ問題なく解放される
} // --Hoge1 == 1
} // --Hoge0 == 1 ... Hoge0が解放されないのでHoge1も解放されない!

Created hoge[0].
Created hoge[1].
最初はなんでこれで循環参照なんの?と思った。
何故解放されないかはコメントの通り。


Hoge::_spYourの型をstd::tr1::weak_ptrに変更すれば解決します。