std::string::find_first_of не возвращает ожидаемое значение

Я пытаюсь создать анализатор XML на С++. В настоящее время я использую cygwin и gcc для компиляции и gdb для отладки. У меня есть этот кусок кода:

const size_t mDataSize = mData.size();  
...  
size_t ltPos = mData.find_first_of('<', pos);  
if (ltPos==mData.npos) {  
...  

mData объявляется как private const std::string внутри класса и содержит содержимое XML-файла. После отладки с помощью gdb я обнаружил следующее:

(gdb) print pos  
$12 = 636  
(gdb) print mDataSize  
$13 = 2692  
(gdb) n  
141             size_t ltPos = mData.find_first_of('<', pos);  
(gdb) print ltPos  
$14 = 114  
(gdb) print pos  
$15 = 636  
(gdb) n  
143             if (ltPos==mData.npos)  
(gdb) print ltPos  
$16 = 4294967295  
(gdb) print mData[636]  
$17 = (const char &) @0xb2b2a8: 10 '\n'  
(gdb) print mData[637]  
$18 = (const char &) @0xb2b2a9: 32 ' '  
(gdb) print mData[638]  
$19 = (const char &) @0xb2b2aa: 32 ' '  
(gdb) print mData[639]  
$20 = (const char &) @0xb2b2ab: 60 '<'  

Я ожидал 639 в результате вызова find_first_of, но я получаю 4294967295 (что равно -1 в 32-битном целом со знаком и соответствует std::string::npos). Может ли кто-нибудь оправдать такое поведение? Или подскажите как это обойти?


person Charlie    schedule 08.10.2011    source источник
comment
Можете ли вы найти более короткую строку, которая приводит к такому поведению? И опубликовать его вместе с минимальным и полным кодом? В нынешнем виде я не могу воспроизвести ошибку.   -  person Beta    schedule 08.10.2011
comment
Могу поспорить, что ошибка в коде, который вы не показали. Поможет минимальный, полный, компилируемый пример, который воспроизводит ошибку.   -  person David Schwartz    schedule 08.10.2011
comment
Кстати, вы можете просто сказать find, если ищете один символ. find_first_of предназначен для поиска любого из заданного набора символов. Никакой разницы, но, думаю, легче читать и рассуждать.   -  person Kerrek SB    schedule 08.10.2011
comment
@Charlie. Кроме того, если вы ищете один символ, функция find будет более очевидным кандидатом для использования, чем find_first_of.   -  person Bo Persson    schedule 08.10.2011
comment
@Charlie: что в строке 142? Согласно вашему выводу gdb, ltpos равно 636 в строке 141, а затем -1 в строке 143. Есть ли код в строке 142? Является ли строка 141 циклом или другой конструкцией?   -  person Carlos    schedule 10.10.2011
comment
@Carlos: строка 142 является пустой строкой, поэтому gdb напрямую переходит со 141 на 143.   -  person Charlie    schedule 10.10.2011


Ответы (1)


Итак, mData объявлен как ссылка? Если это так, он на самом деле не содержит контента, он содержит ссылку на контент. Существует ли вещь, на которую ссылается mData, в то время, когда вы вызываете find_first_of?

person David Grigsby    schedule 09.10.2011
comment
Да, mData объявлен как const std::string внутри класса. Значение этого члена задается в конструкторе. Эта ссылка указывает на std::string, объявленную в основном методе этого приложения как локальную переменную, которая содержит содержимое XML. Приложение использует только один поток, поэтому в процессе синтаксического анализа нет возможности изменить содержимое XML (поскольку внутри синтаксического анализатора mData объявляется константным). Кроме того, как вы можете видеть, gdb показывает, что данные все еще там. - person Charlie; 10.10.2011