字符串标记化期间内存损坏

时间:2017-06-22 07:03:29

标签: c++ c++11 strtok crash-dumps memory-corruption

在执行字符串标记化时,我面临内存损坏和崩溃。在第一次处理时没有发生崩溃。崩溃需要一个多小时。问题

    wchar_t *query = new wchar_t[inQry.length() + 1];

    memset(query, NULL, inQry.length() + 1);
    memcpy(query, inQry.c_str(), inQry.size());


    wchar_t *Tok = wcstok(query, L" ");

    headStr = L"";
    tableName = L"QUERY";

    while(Tok != NULL)
    {
        vectorSQLEntry.push_back(Tok);
        Tok = wcstok(NULL, L" ");
    }

    int tokCount = vectorSQLEntry.size();
    if(query != NULL)
    {
    delete query;
    }

当使用debugdiag进行对角化并分析创建的转储时,它在代码中指出了其他一些行(有时行将为delete query)。 所以我删除了query作为指针并声明为wstring。我删除了 在wcstok和while循环之间初始化headStrtableName(代码如下)。

wstring  tmpQuery = inQry;
wchar_t *Tok = wcstok((wchar_t*)tmpQuery.c_str(), L" ");
while(Tok != NULL)
{
    vectorSQLEntry.push_back(Tok);
    Tok = wcstok(NULL, L" ");
}

使用此代码不会发生崩溃。那么初始代码有什么问题?这次事故让我拖了两天多。

3 个答案:

答案 0 :(得分:2)

你的删除声明应该是delete []query;我希望你在一段时间后内存不足,这可能会导致新的失败和崩溃。

答案 1 :(得分:0)

if(query != NULL)

查询不能为空,因为如果失败,new将抛出异常。

 wcstok((wchar_t*)tmpQuery.c_str(), L" ");

您正在尝试写入只读内存损坏字符串。

答案 2 :(得分:0)

我遇到了同样的问题,我找到了解决问题的正确方法。 您没有正确初始化变量query。您的代码是:

memset(query, NULL, inQry.length() + 1);

第三个参数不对。您应该像下面的代码一样修改它:

memset(query, NULL, (inQry.length() + 1) * sizeof(wchar_t));
...
delete[] query;

然后它会正常工作。