Странное поведение от TinyXML ++ - PullRequest
2 голосов
/ 01 ноября 2008

Надеюсь, что некоторые из вас, люди TinyXML ++, могут мне помочь. Действительно, так как вы рекомендовали мне, прежде чем я думаю, что вы должны мне;)

У меня есть следующий код:

   //ticpp::Iterator< ticpp::Element > child( "SetPiece" );
    ticpp::Iterator< ticpp::Node > child("SetPiece");
    GLuint lc_SPieces = 0;
    for(child = child.begin( this ); child != child.end(); child++ )
    {
        lc_SPieces++;
    }

Если я использую верхнее объявление для child, я получаю ошибку:

Необработанное исключение в 0x7c812aeb в Drawing.exe: исключение Microsoft C ++: __non_rtti_object @ 0x0012f7b4.

И я получаю его в dbgheap.c по следующей строке:

pvBlk = _heap_alloc_dbg(nSize, nBlockUse, szFileName, nLine);

Что странно, так это то, что он работает с Node, и я знаю, что там есть элементы (я проверял это с помощью итерационных методов TinyXML).

Кто-нибудь сталкивался с этим раньше?

Ответы [ 3 ]

1 голос
/ 13 ноября 2008

__non_rtti_object генерируется оператором dynamic_cast, если переданный указатель или ссылка указывает не на полиморфный объект, а на какой-то мусор. Возможно объект был удален ранее.

Просмотрите код в отладчике и проверьте, где используется dynamic_cast и что ему передается.

НТН Пааво

1 голос
/ 02 ноября 2008

просто тыкаю в темноте, я не знаю tinyxml, но кажется, что dynamic_cast пошёл не так. Если вы используете dynamic_cast <> указатель, вы получите NULL-указатель при ошибке. Однако если вы приведете к ссылочному типу, концепция NULL-ссылки отсутствует, поэтому среда выполнения выдает это исключение (или bad_type). MSDN на dynamic_cast и почему это может пойти не так

Строка, которую вы вставили для возникновения исключения, не помогает прояснить ситуацию, поскольку она определяет симптом, а не причину.

Попытайтесь определить, какой актерский состав вышел из строя, вы сможете найти его, если поднимитесь по стеку и найдете последний метод в библиотеках или заголовках tinyxml. Затем вы можете решить, работает ли tinyxml, или вы просто применили его неправильно.

удачи!

0 голосов
/ 02 ноября 2008

Проект -> Свойства -> C / C ++ -> Язык -> Включить информацию о типе времени выполнения

...