2010-10-27 67 views
1

我有一个for循环遍历一个XML文档,并找到一个指定的属性,指向当前节点的指针位于boost :: interprocess :: unique_ptr中,并有一个自定义的deletor调用对象的release()函数。看起来,在每次循环迭代中,指针都被删除,但是当这种情况发生时,函数会抛出。自定义Unique_ptr删除器,受控删除

任何人都可以提出解决方案吗?我想到了实施机制,以检查它是否应该被删除,但我不知道我怎么会做...

代码:

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; 

回答

2

我没有视觉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. 
} 
+0

所以,如果我理解正确的话,目前应该是一个weak_ptr的和迭代器仍然可以是一个的unique_ptr? – 2010-10-27 11:24:57

+0

与VS2003编译,使用boost,而不是C++ 0x – 2010-10-27 11:25:21

+0

对不起,weak_ptr是shared_ptr副本,而不是unique_ptr counter_part(我已编辑我的帖子)。我会用一个简单的指针。 – 2010-10-27 11:26:19