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_ptrspHoge0(new Hoge(0)); // ++Hoge0 == 1
{
shared_ptrspHoge1(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に変更すれば解決します。