我有一个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;
所以,如果我理解正确的话,目前应该是一个weak_ptr的和迭代器仍然可以是一个的unique_ptr? – 2010-10-27 11:24:57
与VS2003编译,使用boost,而不是C++ 0x – 2010-10-27 11:25:21
对不起,weak_ptr是shared_ptr副本,而不是unique_ptr counter_part(我已编辑我的帖子)。我会用一个简单的指针。 – 2010-10-27 11:26:19