我有一个for循环遍历XML文档并找到一个指定的属性,指向当前节点的指针位于boost :: interprocess :: unique_ptr中,并有一个自定义deletor来调用对象的{{1功能。似乎在每次循环迭代时,指针都会被删除,但release()
函数会在发生这种情况时抛出。
有人可以提出解决方案吗?我考虑过实施一种机制来检查它是否应该被删除,但我不确定我是怎么做的......
代码:
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();
}
};
答案 0 :(得分:2)
我没有visual 2010用于在工作中进行编译和调试。所以我不能确定。
但坦率地说,我真的不喜欢你的迭代器拥有你指针的概念。
你的收藏拥有指针,迭代器没有!它不是它的角色..
在C ++ 0x中有一个对shared_ptr的补充,你可以从shared_ptr构造std :: weak_ptr,允许查询和更改数据,但与所有权无关,除非在或多或少不可访问时<_p>释放了由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.
}