gpt4 book ai didi

c++ - 自定义 Unique_ptr 删除器,控制删除

转载 作者:行者123 更新时间:2023-11-30 04:37:16 27 4
gpt4 key购买 nike

我有一个 for 循环遍历 XML 文档并找到指定的属性,指向当前节点的指针位于 boost::interprocess::unique_ptr 内,并且有一个自定义删除器来调用对象的 释放()功能。似乎在每次循环迭代中指针都会被删除,但 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;

最佳答案

我上类没有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.
}

关于c++ - 自定义 Unique_ptr 删除器,控制删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4032573/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com