2016-08-14 69 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

谢谢你指出这一点。我用push_back替换了Result [i]和result [i],它工作正常。我将通过我明天发布的WinHTTP包装器的代码,因为只是简单地看一下它(之前从未做过,因为我不需要)显示了很多奇怪的东西。 – TR3M4