Добрый день. Проблема в следующем. У меня есть действительный файл * .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) Почему код работал без ошибок при использовании dynamic_cast в Windows, но не в Unix? Это может быть проблема с компилятором или версией библиотеки?
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
Хорошо, причина была в следующем: библиотека Xerces не создается по умолчанию с включенным RTTI. Чтобы заставить механику в OP работать, библиотека должна быть перестроена с включенным RTTI. https://issues.apache.org/jira/browse/XERCESC-819