[2009 �N 8 ����] |
�m�Z�p�u���n
�ڎ�
1. �X�}�[�g�|�C���^�Ƃ́H
2. �T�[�h�p�[�e�B���C�u�����Ƃ̋���
2.1. �N���XCache���Ȃ�shared_ptr��K�v�Ƃ���̂�
2.2. �Ȃ��A�N���XCache��shared_ptr��n�����Ƃ��ł��Ȃ��̂�
3. weak_ptr�̗��p
4. �܂Ƃ�
boost::weak_ptr�𗘗p����P�[�X�ɂ��Ă��b������O�ɁA�܂��A�X�}�[�g�|�C���^�ɂ��Ă̊T�v�����͂Ȃ�����K�v������܂��B�Ȃ��Ȃ�Aboost::weak_ptr�́A�i������Ɠ���ȁj�X�}�[�g�|�C���^�̈�킾����ł��B
�X�}�[�g�|�C���^�Ƃ́A�����i�X�}�[�g�ȁj�|�C���^�Ƃ������O�̗R��������z���ł��邩�Ǝv���܂����A�w�������I�u�W�F�N�g�̌�n�������������Ă����A�|�C���^�̂悤�ɐU�镑���N���X�e���v���[�g�̂��Ƃł��B
�v���O���~���O����C++�ł́A��������e��n���h���Ȃǂ̃��\�[�X�̊Ǘ��ɃX�}�[�g�|�C���^�𗘗p���܂��B�X�}�[�g�|�C���^��p���邱�ƂŁA���\�[�X�̉��������������A���\�[�X���[�N����h�����Ƃ��ł��܂��B
�c�O�Ȃ���A���݂�C++�iC++03�j�W���ł́A�ėp�I�ɗ��p�ł���X�}�[�g�|�C���^������Ă��܂���istd::auto_ptr������Ă���̂ł����A���p�ɂ����鐧�������߁A���p�\�ȃP�[�X�������܂��j�B�������ABoost���C�u�����𗘗p���邱�ƂŁA�l�X�ȃX�}�[�g�|�C���^�����p�\�ɂȂ�܂��BBoost���C�u�����Ɋւ��ẮAhttps://boost.cppll.jp/HEAD/�ɂē��{��ŏЉ��Ă���̂ŎQ�Ƃ��Ă݂Ă��������B�ŐV�̏��͖{�Ƃ̃T�C�g�i�p��jhttps://www.boost.org/���Q�Ƃ��Ă��������B
���āA����M�҂����p�����̂́Aboost::shared_ptr�ł��B�܂��Aboost::shared_ptr�ƂĂ��V���v���ȗ��p�C���[�W���ȉ��Ɏ����܂��B
���Ȃ��A�L���̃^�C�g���ł�����boost::weak_ptr�́Aboost::shared_ptr�ƍ��킹�Ďg���A����ȃX�}�[�g�|�C���^�ł����A����Ɋւ��Ă���ق��G��܂��B
#include <boost/shared_ptr.hpp> #include <iostream> class MyClass; typedef boost::shared_ptr<MyClass> MyClassSp; class MyClass { public: MyClass() { std::cout << "Created" << std::endl; } ~MyClass() { std::cout << "Destroyed" << std::endl; } }; int main() { std::cout << "Test started" << std::endl; { MyClassSp sp(new MyClass); } std::cout << "Test finished" << std::endl; }
���̃R�[�h�����s����ƁA�ȉ��̂悤�ɏo�͂����͂��ł��B�Ȃ��A���̃R�[�h���R���p�C�����邽�߂ɂ́Aboost���C�u�����̃p�X���C���N���[�h�p�X�Ɏw�肷��K�v������܂��B
Test started Created Destroyed Test finished
boost::shared_ptr�̃C���X�^���Xsp���A�X�R�[�v����O�ꂽ�^�C�~���O�Ŏw�������I�u�W�F�N�g��delete���Ă��邱�Ƃ��킩��܂��BTest finished���\�������O�ɁADestroyed���\������Ă��邱�ƂŁA�m�F�ł��܂��ˁB
�Ȃ��Aboost::shared_ptr�͎Q�ƃJ�E���g�����̃X�}�[�g�|�C���^�ŁAshared_ptr�I�u�W�F�N�g���R�s�[�R���X�g���N�g����x�ɁA�Q�ƃJ�E���g�������Ă����Ashared_ptr�I�u�W�F�N�g���j�������x�ɎQ�ƃJ�E���g�������Ă����d�g�݂ƂȂ��Ă��܂��B�����ĎQ�ƃJ�E���g���[���ɂȂ����^�C�~���O�ŁA�w�������I�u�W�F�N�g��delete���܂��B
Boost�́Aboost::shared_ptr�ȊO�ɂ��l�X�ȃX�}�[�g�|�C���^����Ă��܂��B�ڍׂ́A�ȉ����Q�Ƃ��Ă��������B
- ���{��@https://boost.cppll.jp/HEAD/libs/smart_ptr/smart_ptr.htm
- �{�Ɓi�p��jhttps://www.boost.org/doc/libs/1_39_0/libs/smart_ptr/smart_ptr.htm
�� ���{��ł́A�ŐV�łɊ�Â����łȂ��ꍇ������܂��̂ŁA�����Ӊ������B
���āA���̂悤�ɕ֗��ȃX�}�[�g�|�C���^�Ȃ̂ł����A�T�[�h�p�[�e�B�̃��C�u�����Ƃ̋����ɂ����Ă͍H�v���K�v�ȏꍇ������܂��B�܂��A�ȉ��̃N���X�}���������������B
�����ŁA���F�Â����ꂽ�N���X�Ɗ֘A�A�ĉ��Ȃǂ̐��ɒ��ڂ��Ă��������B����炪�T�[�h�p�[�e�B�̃��C�u�����Ƃ����z��ł��B�N���XDownloader�́A����download���Ăяo�����ƂŁA�����Ŏw�肳�ꂽDownloadObject�ɐݒ肳�ꂽURI�ɑ��݂���f�[�^��http�Ń_�E�����[�h����Ƃ����@�\����܂��B�܂��ADownloadObject�ɂ̓_�E�����[�h�v���̗D��x���ݒ肵�܂��B���C�u�������p�҂́ADownloadObject���T�u�N���X�����ė��p���܂��B
���Y�I�u�W�F�N�g�̃_�E�����[�h������������AdownloadCompleted���Ăяo�����̂ŁA������I�[�o�[���C�h���Ď��O�̏������s���܂��B���ꂪ�A�T�[�h�p�[�e�B�̃��C�u����������@�\�ł��B
����A�N���C�A���g�i�T�[�h�p�[�e�B�̃��C�u�����𗘗p����A�v���j���́A���\�[�X�̊Ǘ���shared_ptr�i�ȍ~�{�����ł�boost::���ȗ�����j�ōs���|���V�[�Ƃ��Ă��܂��B�N���XClient��Content������shared_ptr<Content>�Ƃ��ĕێ����܂��B�܂��A���̃A�v���ɂ̓L���b�V�����J�j�Y�������݂��܂��B�L���b�V�����J�j�Y���́A�N���XCache���_�E�����[�h�ς݂�Content��shared_ptr��ێ����邱�ƂŎ�������܂��B�������Ă������ƂŁAClient���_�E�����[�h�ς݂�Content��j�����Ă��A���ۂɔj���͍s��ꂸ�A�L���b�V������Ď擾���邱�Ƃ��\�ƂȂ�܂��B�Ȃ��A�N���XCache�̃C���X�^���X�̓V�X�e���łЂƂ������݂��A�O���[�o���Ɏ擾�\�ƂȂ��Ă��܂�(Singleton�p�^�[��)�B
�Ȃ��AClient�ɂ��Content�̔j����Cache�����Content�̎擾�Ƃ������ׂ��������́A�{�L���̒��S�e�[�}�ł͂Ȃ����߁A�ȗ����Ă��܂��B
���āA���̂悤�Ȏd�g�݂��������邽�߂ɂ́A�T�[�h�p�[�e�B�̒���N���XDownloadObject�̑���downloadCompleted()���ǂ̂悤�ɃI�[�o�[���C�h���Ď�������悢�ł��傤���B�ȉ��̃V�[�P���X�}���������������B
�܂��AContent�̃��C�t���C���ɒ��ڂ��Ă��������B�_�E�����[�h����������ƁA4:downloadCompleted()���Ăяo����A���̓����ŁA4.1:render()���Ăяo���Ă��܂��B�����Ń_�E�����[�h�����R���e���c�������_�����O���܂��B����ɁA���O�̃L���b�V�����J�j�Y���ɂ��̃R���e���c��o�^���邽�߂ɁA4.3:addContent()���Ăяo���܂��B���̂��߂ɂ́ACache�I�u�W�F�N�g�ɃA�N�Z�X����K�v������܂����ASingleton�Ƃ����O��Ȃ̂ŁA4.3:addContent()�̒��O�ŁA4.2:getInstance()���Ăяo���Ď擾���Ă��܂��B
����ł��܂������͂��Ȃ̂ł����A�ЂƂ�肪����܂��B�N���XCache�̑���addContent()���A�p�����[�^�Ƃ���shared_ptr<Content>��v�����Ă���̂ł����A�����n�����Ƃ��ł��Ȃ��Ƃ������ł��B
�����Řb�����܂��傤�B�|�C���g��2����܂��B�ЂƂ́A�u�N���XCache���Ȃ�shared_ptr<Content>��K�v�Ƃ���̂��v�����ЂƂ́A�u�Ȃ��A�N���XCache��shared_ptr<Content>��n�����Ƃ��ł��Ȃ��̂��v�ł��B
�@2.1. �N���XCache���Ȃ�shared_ptr��K�v�Ƃ���̂�
�܂��͑O�҂���l���Ă݂܂��傤�B�N���XCache��shared_ptr<Content>�̑���ɁAContent *����Ƃ����̂͂ǂ��ł��傤���H�����Ȃ��Ă���AdownloadCompleted()�̓�����this�|�C���^��n���悢���ƂɂȂ�܂��B�������A�i�X�}�[�g�|�C���^�ł͂Ȃ��j�ʏ�̃|�C���^���ƁACache���Ŏ����J�����ł��Ȃ��Ȃ��Ă��܂��܂��B�ł́AaddContent()�̓����ň����Ŏ�Content *�����ɁAshared_ptr<Content>�����Ƃ����̂͂ǂ��ł��傤���H
����́Ashared_ptr�̎Q�ƃJ�E���g�̎d�g�݂������ł��Ă��Ȃ��A���ɂ܂����A�v���[�`�ł��B����ł̓�������2�d�ɉ�����Ă��܂��܂��B�ȉ��̃R�[�h���������������BCache��Content *����shared_ptr��V���ɍ쐬����ƁA�ȉ��̃R�[�h���l�̂��Ƃ��������邱�ƂɂȂ�̂ł��B
#include <boost/shared_ptr.hpp> #include <iostream> class Content; typedef boost::shared_ptr<Content> ContentSp; class Content { public: Content() { std::cout << "Created" << std::endl; } ~Content() { std::cout << "Destroyed" << std::endl; } }; int main() { std::cout << "Test started" << std::endl; { Content *p = new Content; ContentSp sp1(p); // Client�ɂĕێ� ContentSp sp2(p); // Cache�ɂĕێ� } std::cout << "Test finished" << std::endl; }
sp2��sp1�Ɠ����I�u�W�F�N�g���w���Ă��܂����Asp1��sp2�̊Ԃɂ͉��̊W������܂���B����āAshared_ptr�������I�u�W�F�N�g�����L���Ă��邱�Ƃ�sp1��sp2���m�邷�ׂ��Ȃ��̂ł��B����āA���ꂼ��shared_ptr���X�R�[�v����O�ꂽ�Ƃ��ɁA�w�������I�u�W�F�N�g��delete���܂��B���̌��ʁA�����I�u�W�F�N�g��2��delete����邱�ƂɂȂ�܂��B�M�҂̊��ł́A���s���ʂ́A�ȉ��̂悤�ȏo�͂ƂȂ�܂����B�Ȃ��A��������2�d������s���Ă��܂��Ă��邽�߁A���ɂ���Ď��s�����ꍇ�̐U�镑�����قȂ�܂��B
Test started Created Destroyed Destroyed Segmentation fault (core dumped)
shared_ptr�́A����shared_ptr����R�s�[�R���X�g���N�g���邩�A����shared_ptr�������ꂽ�ꍇ�ɂ̂݁A���̑���̎w�������I�u�W�F�N�g�𐳂������L���邱�ƂɂȂ�܂��B����āA��L�R�[�h���ȉ��̂悤�ɏC������AContent�͈�x������������悤�ɂȂ�A���Ȃ����삵�܂��B
#include <boost/shared_ptr.hpp> #include <iostream> class Content; typedef boost::shared_ptr<Content> ContentSp; class Content { public: Content() { std::cout << "Created" << std::endl; } ~Content() { std::cout << "Destroyed" << std::endl; } }; int main() { std::cout << "Test started" << std::endl; { Content *p = new Content; ContentSp sp1(p); // Client�ɂĕێ� ContentSp sp2(sp1); // Cache�ɂĕێ� } std::cout << "Test finished" << std::endl; }
�܂�A�R�s�[�R���X�g���N�g�ɂ���A����ɂ���A�I�u�W�F�N�g�����L���邽�߂ɂ́A���L���ƂȂ�I�u�W�F�N�g�̃|�C���^�ł͂Ȃ�shared_ptr���K�v�Ƃ������Ƃł��B
�@2.2. �Ȃ��A�N���XCache��shared_ptr��n�����Ƃ��ł��Ȃ��̂�
���Ď��ɁA��ҁu�Ȃ��A�N���XCache��shared_ptr<Content>��n�����Ƃ��ł��Ȃ��̂��v�ɂ��čl���Ă݂܂��傤�B
���́A�N���XDownloader�̑���download()�̃p�����[�^�Ƃ��āADownloadObject *��n���Ă���_�ɂ���܂��B�������A�����̓T�[�h�p�[�e�B�̃��C�u�����ł��邽�߁A�C�����邱�Ƃ��ł��܂���B����Ȃ킯�ŁA���̖��͍��̂Ƃ����������܂���B���C�u������������N���X���T�u�N���X�����ė��p����P�[�X�́A����ɓ��Ă͂܂�܂��B
���ɁA�T�[�h�p�[�e�B�̃��C�u�������C���ł�����邢�́A�����Ń��C�u�������쐬���Ă���悤�ȏŁA�N���XDownloader�̑���download()�̃p�����[�^��shared_ptr<DownloadObject>�ɂ��邱�Ƃ��ł���A���͉�������̂ł��傤���H���́A����ł����܂������܂���B�ڍׂ́A�R�����ushared_ptr�ƃ|�����[�t�B�Y���v���Q�Ƃ��Ă��������B
�Ȃ�Ƃ��AContent�̃|�C���^����Ashared_ptr<Content>�����o�����@�͖������̂ł��傤���H���o���̂������Ȃ�ŏ����疄�ߍ���ł݂Ă͂ǂ��ł��傤�B�܂�A�N���XContent�̃����o�ϐ��Ƃ���shared_ptr<Content>����������킯�ł��B
class Content; typedef boost::shared_ptr<Content> ContentSp; class Content:public DownloadObject { public: static ContentSp create(std::string uri, int priority) { ContentSp s(new Content(uri, priority)); s->setSp(s); return s; } virtual ~Content() { std::cout << "Destroyed" << std::endl; } virtual void downloadCompleted() { std::cout << "downloadCompleted" << std::endl; Cache::getInstance().addContent(self_); } private: Content(std::string uri, int priority) :DownloadObject(uri, priority) { std::cout << "Created" << std::endl; } void setSp(const ContentSp &sp) { self_ = sp; } ContentSp self_; // ���g��shared_ptr�����B�܂����A�v���[�` };
���̃A�v���[�`�ɂ���āA�I�[�o�[���C�h����downloadCompleted()�̒�����A���g��shared_ptr�ł���self_�ɃA�N�Z�X���邱�Ƃ��\�ƂȂ�܂����B�����Cache�ɓn���悢�킯�ł��B
�Ȃ��A��L�R�[�h�́A�N���XContent�̕��������Ă��܂��B�S�̂́Asp_self.cpp�ƂȂ�܂��B���āA��������s����ƌ��ʂ͈ȉ��̂悤�ɂȂ�܂����B
Test started Created downloadCompleted Test finished
�N���XContent�̃f�X�g���N�^���Ă�邱�Ƃŏo�͂����͂���Destroyed���o�͂���Ă��܂���B����͂Ȃ��ł��傤�H
shared_ptr�́A���̃f�X�g���N�^���Ă��Ƃ��ɁA�Q�ƃJ�E���g��1���Z���A�Q�ƃJ�E���g��0�ɂȂ����Ƃ��ɁA�w�������I�u�W�F�N�g��delete���܂��B�������Aclass Content�̃����o�ϐ��Ƃ���self_�������Ă���A���ꂪ���g���w�������Ă��邽�߁AContent::create���Ăяo��������̎Q�ƃJ�E���g��2�ƂȂ�܂��B�����āA���p����shared_ptr<Content>���X�R�[�v����O�ꂽ�Ƃ��ɁA�Q�ƃJ�E���g��1�ɂȂ�܂��B���̒i�K�ŎQ�ƃJ�E���g��0�ɂȂ��Ă��Ȃ����߁A�I�u�W�F�N�g��delete����܂���B�Q�ƃJ�E���g��0�ɂȂ邽�߂ɂ́AContent�I�u�W�F�N�g���j�������K�v������܂��B�j������ɂ�delete�Ăяo�����K�v�ł����B����āA���܂Ōo���Ă��I�u�W�F�N�g���j������Ȃ��A���̃f�b�h���b�N�Ɋׂ��Ă��܂��B
����ȏ���������̂��Aweak_ptr�ł��Bweak_ptr�́A�Q�ƃJ�E���g�𑝂₳�Ȃ��X�}�[�g�|�C���^�̈��ł��Bweak_ptr��shared_ptr�ƈꏏ�Ɏg���悤�ɐv����Ă��邽�߁A�P�̂Ŏg�����Ƃ͂���܂���B
�Q�ƃJ�E���g�𑝂₳�Ȃ��X�}�[�g�|�C���^�Ƃ����ƁA�ʏ�̃|�C���^�Ƒ卷�������悤�Ɏv���܂����A�ő�̈Ⴂ�́Aweak_ptr�����shared_ptr�����o���i���������L����`�ō��o���j���Ƃ��ł���_�ɂ���܂��B
class Content; typedef boost::shared_ptr<Content> ContentSp; typedef boost::weak_ptr<Content> ContentWp; class Content:public DownloadObject { public: static ContentSp create(std::string uri, int priority) { ContentSp s(new Content(uri, priority)); s->setWp(s); return s; } virtual ~Content() { std::cout << "Destroyed" << std::endl; } virtual void downloadCompleted() { std::cout << "downloadCompleted" << std::endl; Cache::getInstance().addContent(self_.lock()); } private: Content(std::string uri, int priority) :DownloadObject(uri, priority) { std::cout << "Created" << std::endl; } void setWp(const ContentSp &sp) { self_ = sp; } ContentWp self_; };
��̃R�[�h�i���S�ȃR�[�h��wp_self.cpp�j������ƁAclass Content�̃����o�ϐ�self_���AContentWp�ɂȂ��Ă��܂��BContentWp�́Aboost::weak_ptr<Content>��typedef�ł��Bcreate�����o�����Ăяo�����ƁAprivate�����o��setWp��ʂ���self_���Z�b�g����܂��B���̂悤�ɁAweak_ptr�́Ashared_ptr�ƃZ�b�g�ŗ��p���܂��B�����āA�����o��downloadCompleted��`�̒��ŁAclass Cache�̃����o��addContent��self_��n���Ă���̂ł����A�����ŁAself_.lock()�Ƃ����Ăяo�����s���Ă��܂��B���̌Ăяo���ɂ���āAweak_ptr����shared_ptr�����o���Ă���̂ł��B
�Ȃ��Alock()�́A�N���X�e���v���[�gweak_ptr�̃����o���ł��B���̃����o���́A�Ή�����shared_ptr���L���ł���Ȃ�A���Ȃ킿�Q�ƃJ�E���g��1�ȏ�ŁA�I�u�W�F�N�g���܂�delete���Ă��Ȃ��Ȃ�A���̃I�u�W�F�N�g��shared_ptr��Ԃ��܂��Bshared_ptr�������ɂȂ��Ă���Ȃ�Ashared_ptr���f�t�H���g�R���X�g���N�g���ĕԂ��܂��Bshared_ptr���f�t�H���g�R���X�g���N�g����ƁA�Ȃɂ��w���Ă��Ȃ��ANULL�|�C���^�̂悤�ɐU�镑��shared_ptr������܂��B
weak_ptr�������o�ϐ��Ƃ��Ēlj������N���X�}���A�ȉ��Ɏ����܂��B
�@4. �܂Ƃ�
����́A�X�}�[�g�|�C���^�̊�{�I�ȗ��p���@���Љ�܂����B���ɁA�I�[�o�[���C�h���ꂽ�����o����this�|�C���^����Ashared_ptr�����o�����߂ɁAweak_ptr���L���ɗ��p�ł��邱�Ƃ������܂����B
���̂悤�ȍ\���́A����Ꭶ�����_�E�����[�_�����łȂ��AGUI�c�[���L�b�g�Ȃǂł��悭��������\���ł��iWidget���T�u�N���X�����ăC�x���g�����P�[�X�Ȃǁj�Bweak_ptr�́A�l�X�ȏ�ʂŁAshared_ptr��p���ēO��I�ȃ��\�[�X�Ǘ������悤�Ƃ���ۂ́A���͂Ȏx����i�ƂȂ��Ă���邱�Ƃł��傤�B
����́A���̂悤�ȍ\���ŕ\�������N���X��ۑ��E�������邽�߂̃V���A���C�Y�ɂ��ďЉ��\��ł��B
© 2009 OGIS-RI Co., Ltd. |
|