【问题标题】:Xerces. Dynamic casting DOMNode pointer to DOMElement returns a nullptr锻炼。将 DOMNode 指针动态转换为 DOMElement 返回一个 nullptr
【发布时间】:2015-11-14 00:25:46
【问题描述】:

美好的一天。问题如下。我有一个有效的 *.xml 文件,我尝试使用以下代码对其进行解析:

for(XMLSize_t i = 0; i < childrenNodeCount; ++i)
{
  DOMNode* currentNode = children->item(i);

  if ((currentNode->getNodeType() != 0) && (currentNode->getNodeType() == DOMNode::ELEMENT_NODE))
  {
    DOMElement* currentElement = dynamic_cast<xercesc::DOMElement*>(currentNode); // !!!

    if (XMLString::equals(currentElement->getTagName(), TAG_SectionHeader))
    {
      // parse this part
    }

    if (XMLString::equals(currentElement->getTagName(), TAG_SectionBody))
    {
      // parse this part
    }
  }
}

程序在第一次“等于”检查时使用 SIGILL 在执行期间崩溃。调试显示,在动态转换之后,currentElement 实际上是一个空指针。这可能是什么问题?

使用 xlc++、Xerces 库 2.5、AIX 7 编译。

附:显然,相同的代码在 Windows 上也能正常工作。

更新:将 dynamic_cast 更改为 static_cast 使代码运行无误。然而,它留下了一些没有答案的问题。

1) 为什么在 Windows 上使用 dynamic_cast 时代码运行没有错误,而在 Unix 上却没有?可能是编译器或库版本问题?

2) 在这种情况下是否有更好/更清洁的投射方式?

【问题讨论】:

  • currentNode 不是DOMElement。哦,currentNode-&gt;getNodeType() != 0) 完全没有必要。
  • 确实是一个DOMNode指针。这正是重点。我正在尝试对派生类指针进行强制转换。
  • dynamic_cast 在无法执行转换时返回 null。由于currentNode 不是 DOMElement,因此转换失败并返回 null。当currentNode 不是DOMElement 而您使用static_cast 时,结果是未定义的行为。任何好的调试器都会告诉你 currentNode 到底是什么类型。
  • @CaptainObvlious,好的。所以。情况如下: DOMNode 是 DOMElement 的父级。这两个类都是纯虚拟的。我用来构造该代码的 xerces 示例使用了动态转换。即使在这里完成了stackoverflow.com/questions/4746631/…我该怎么办?

标签: c++ xml aix xerces xlc


【解决方案1】:

好的,原因如下:默认情况下,Xerces 库不是在启用 RTTI 的情况下构建的。为了使 OP 中的机制正常工作,应该在启用 RTTI 的情况下重建库。 https://issues.apache.org/jira/browse/XERCESC-819

【讨论】:

    【解决方案2】:

    您没有提及编译器版本或选项,您是否指定了 -qrtti 以启用 dynamic_cast?

        -qrtti=<option> | -qnortti
                (C++) Generates runtime type identification (RTTI)
                information for the typeid and dynamic_cast
                operators.  The suboptions are:
    
                all
                     Generates the information needed for the RTTI
                     typeid and dynamic_cast operators.
                type | typeinfo
                     Generates the information needed for the RTTI
                     typeid operator only.
                dyna | dynamiccast
                     Generates the information needed for the RTTI
                     dynamic_cast operator only.
    
                Default: -qnortti
    

    【讨论】:

    • 是的,rtti 已启用。
    猜你喜欢
    • 2022-11-21
    • 2022-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多