ObjectSquare [2009 �N 8 ����]

�m�Z�p�u���n


1. boost::weak_ptr�𗘗p����P�[�X


������� �I�[�W�X����
�g�ݍ��݃\�����[�V������
�ߓ��@�M�r

�ڎ�

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. �܂Ƃ�

�@1�D�X�}�[�g�|�C���^�Ƃ́H

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

�� ���{��ł́A�ŐV�łɊ�Â����łȂ��ꍇ������܂��̂ŁA�����Ӊ������B

�@2�D�T�[�h�p�[�e�B���C�u�����Ƃ̋���

���āA���̂悤�ɕ֗��ȃX�}�[�g�|�C���^�Ȃ̂ł����A�T�[�h�p�[�e�B�̃��C�u�����Ƃ̋����ɂ����Ă͍H�v���K�v�ȏꍇ������܂��B�܂��A�ȉ��̃N���X�}���������������B

T[hp[eBCuƂ̋(NX})

�����Ł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

T[hp[eBCuƂ̋(V[PX})

�܂��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

�@3�Dweak_ptr�̗��p

�Ȃ�Ƃ��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

weak_ptroɒlj(NX})

�@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.
Index Next
Index Next