良い一日。問題は次のとおりです。次のコードを使用して解析しようとする有効な *.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
}
}
}
最初の「equals」チェックで SIGILL を使用して実行中にプログラムがクラッシュします。デバッグは、動的キャストの後、currentElement が実際にはヌル ポインターであることを示しました。ここで何が問題になる可能性がありますか?
xlc++、Xerces ライブラリ 2.5、AIX 7 でコンパイル。
PS 同じコードが Windows でも正常に動作するようです。
更新: dynamic_cast を static_cast に変更すると、コードがエラーなしで実行されました。しかし、それはいくつかの疑問を未解決のままにしました。
1) Windows では dynamic_cast を使用しているのに、Unix では使用していないときにコードがエラーなしで実行されたのはなぜですか? コンパイラまたはライブラリのバージョンの問題でしょうか?
2) この場合、キャストするためのより良い/よりクリーンな方法はありますか?