2016-08-14 1 views
0

У меня появилась следующая функция, которая случайным образом разбивается при преобразовании строки в wstring. Он используется для анализа HTTP-заголовков (http://www.codeproject.com/Articles/66625/A-Fully-Featured-Windows-HTTP-Wrapper-in-C) и всегда работал нормально, но он случайно переставал работать, когда я недавно менял сервер. (Этот код исходит из классов, которые входят в проект codeproject)Сбой при преобразовании строки в wstring

inline bool ParseRegExpW(const wstring &regExp, bool caseSensitive, int groupCount, const wstring &source, vector<wstring> &result, bool allowDuplicate = false) 
{ 
    const string regEXP = string(regExp.begin(), regExp.end()); 
    const string Source = string(source.begin(), source.end()); 
    vector<string> Result; 
    if (result.size() != 0){ 
     for (int i = 0; i < result.size(); i++) { 
      Result[i] = string(result[i].begin(), result[i].end()); 
     } 
    } 
    bool res = ParseRegExp(regEXP, caseSensitive, groupCount, Source, Result, allowDuplicate); 
    if (Result.size() != 0){ 
     for (int i = 0; i < Result.size(); i++) { 
      printf("Result: %i->%s L: %i : R %i r %i\n", i, Result[i].c_str(), Result[i].length(), Result.size(), result.size());//Result[i] contains what it should contain 
      if (i < Result.size()){ 
       printf("Converting...\n"); 
       result[i] = wstring(Result[i].begin(), Result[i].end()); 
       printf("Will crash before getting there..\n"); 
      } 
     } 
    } 
    return res; 
} 

Почему это происходит? Мне так странно, что последние месяцы работало нормально и перестало работать, когда я сменил сервер.

+0

'operator []' does ** not ** добавить какие-либо новые элементы в 'std :: vector'. Так что если 'result.size()! = 0', это тоже сработает. –

+0

'vector Результат:' создает вектор нулевого размера. Вы должны использовать 'Result.push_back()' вместо 'Result [i]' при добавлении содержимого. –

+1

Кроме того, наличие как результата «результата», так и «результата» просто требует опечатки или двух! –

ответ

0

Предполагая result.size() == 0, когда вы получаете в этом цикле и ...

result[i] = wstring(Result[i].begin(), Result[i].end()); 

... то независимо от значения i, вы получите неопределенное поведение из-за получением доступа к не- существующий элемент вектора.

Если result.size() != 0, то этот код путь будет выполнен ...

vector<string> Result; 
if (result.size() != 0){ 
    for (int i = 0; i < result.size(); i++) { 
     Result[i] = string(result[i].begin(), result[i].end()); 
    } 
} 

... который имеет те же вопросы в отношении пустого вектора Result.

Мне интересно, как это могло когда-либо срабатывать.

+1

Спасибо, что указали это. Я заменил результат Result [i] и result [i] на push_back, и он отлично работает. Я рассмотрю код этой обертки WinHTTP, который я разместил выше завтра, потому что просто быстро посмотрел на нее (чего я никогда не делал раньше, так как мне не нужно) показывает много вещей, которые странны. – TR3M4

Смежные вопросы