【问题标题】:Crashing while converting string to wstring将字符串转换为 wstring 时崩溃
【发布时间】:2016-08-14 16:13:34
【问题描述】:

以下函数在将字符串转换为 wstring 时随机崩溃。它用于解析 HTTP 标头(http://www.codeproject.com/Articles/66625/A-Fully-Featured-Windows-HTTP-Wrapper-in-C)并且一直运行良好,但是当我最近更改服务器时它随机停止工作。 (此代码来自codeproject项目自带的类)

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;
}

为什么会这样?对我来说太奇怪了,过去几个月它运行良好,当我更换服务器时停止运行。

【问题讨论】:

  • operator[]将任何新元素插入std::vector。所以如果result.size() != 0 这也会崩溃。
  • vector&lt;string&gt; Result; 创建一个大小为零的向量。添加内容时应使用Result.push_back() 而不是Result[i]
  • 另外,同时拥有resultResult 只是乞求一两个错字!

标签: c++ regex http


【解决方案1】:

假设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 有同样的问题。

我想知道这怎么可能奏效。

【讨论】:

  • 感谢您指出这一点。我用 push_back 替换了 Result[i] 和 result[i] ,它工作正常。明天我将浏览我在上面发布的那个 WinHTTP 包装器的代码,因为只是快速查看它(我以前从未做过,因为我不需要)显示了很多奇怪的东西。
猜你喜欢
  • 1970-01-01
  • 2018-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-04
  • 2016-02-20
  • 2013-08-17
  • 2011-05-20
相关资源
最近更新 更多