1

XML ドキュメントを繰り返し処理し、指定された属性を見つける for ループがあります。現在のノードを指すポインターは、boost::interprocess::unique_ptr 内にあり、オブジェクトのrelease()関数を呼び出すカスタム deletor があります。ループの反復ごとにポインターが削除されるようですが、それが発生するrelease()と関数がスローされます。

誰かが解決策を提案できますか? 削除する必要があるかどうかを確認するメカニズムを実装することを考えましたが、どうすればよいかわかりません...

コード:

typedef bi::unique_ptr<DOMNodeIterator, release_deleter> iterator_ptr;
typedef bi::unique_ptr<DOMNode, release_deleter> node_ptr;

iterator_ptr itera(document->createNodeIterator(rootelement, DOMNodeFilter::SHOW_ALL, NULL, true));

for(node_ptr current(itera->nextNode()); current != 0; current.reset(itera->nextNode())) // throws after one iteration...
{   

....

オブジェクトrelease()

void DOMElementNSImpl::release()
{
    if (fNode.isOwned() && !fNode.isToBeReleased())
        throw DOMException(DOMException::INVALID_ACCESS_ERR,0, GetDOMNodeMemoryManager);  // throws here if released after each loop iteration

    DOMDocumentImpl* doc = (DOMDocumentImpl*) fParent.fOwnerDocument;
    if (doc) {
        fNode.callUserDataHandlers(DOMUserDataHandler::NODE_DELETED, 0, 0);
        fParent.release();
        doc->release(this, DOMMemoryManager::ELEMENT_NS_OBJECT);
    }
    else {
        // shouldn't reach here
        throw DOMException(DOMException::INVALID_ACCESS_ERR,0, GetDOMNodeMemoryManager);
    }
}

削除者:

struct release_deleter
{
    template <typename T>
    void operator()(T* pPtr) const
    {
        pPtr->release();
    }
};

編集:

virtual DOMNodeIterator *createNodeIterator(DOMNode* root,
                                            DOMNodeFilter::ShowType whatToShow,
                                            DOMNodeFilter* filter,
                                            bool entityReferenceExpansion) = 0;


virtual DOMNode*           nextNode() = 0;
4

1 に答える 1

2

自宅でのみコンパイルおよびデバッグするための Visual 2010 を持っていません。だから確信が持てない。

しかし率直に言って、イテレータがポインタを所有しているという概念は本当に好きではありません。

あなたのコレクションはポインタを所有していますが、イテレータはそうではありません! その役割ではない..

C++0x では、shared_ptr から構築できる std::weak_ptr である shared_ptr の補完があり、データを参照して変更することができますが、ポインタがオンになったときに多かれ少なかれアクセスできなくなることを除いて、所有権とは何の関係もありません。 shared_ptr によって解放されます。

イテレータには一種の std::weak_ptr を使用します。しかし、unique_ptr の場合、弱い参照の役割を担うのは、データに対する単純なポインターだと思います。

編集:

DOMNodeIterator * pIter = document->createNodeIterator(rootelement, DOMNodeFilter::SHOW_ALL, NULL, true);

if(pIter==NULL)
{
    return;
}

while(true) // be careful to infinite loops
{
    DOMNode * pNode = pIter->nextNode();
    if (pNode==NULL)
    {
        break;  
    }

    // ... your visiting the nodes here.
}
于 2010-10-27T11:19:20.057 に答える