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

C++ 字符串标记化期间内存损坏,c++,c++11,strtok,crash-dumps,memory-corruption,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" "); headS

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

    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进行诊断并分析创建的转储时,它指出代码中的其他行。有时该行将被删除查询。 因此,我删除了作为指针的查询,并声明为wstring。然后我移除了 在wcstok和while循环代码之间初始化headStr和tableName,如下所示

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

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

您的delete语句应该是delete[]query;我希望您在一段时间后会耗尽内存,这可能会导致new失败和崩溃

if(query != NULL)
查询不能为null,因为如果失败,new将引发异常

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

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

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

memset(query, NULL, inQry.length() + 1);
第三个参数不正确。您应该修改它,就像下面的代码一样:

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

然后它将正常工作。

vectorSQLEntry支持什么?确切的类型是什么?vector的定义-vector vectorSQLEntry;当您遇到内存损坏问题时,您还应该证明Valgrind无法识别问题-否则看起来好像您还没有尝试过。您正在尝试写入只读内存损坏字符串。-但是有了这个密码,我就不会崩溃了。。!你的意思是,如果我在这一行之后访问tmpQuery,我会得到一个异常吗?@Sel_va从技术上讲,没有什么可以阻止wcstok立即崩溃。代码中不应出现c样式和常量转换。这件作品绝对不需要任何造型。此外,您还应更新您的问题以包括。根据vectorSQLEntry类型以及之前/之后发生的任何情况,您可能会遇到不同的问题。vector的类型是wstring。我只是用标记化字符串填充向量,然后搜索一个单词并从该函数返回该WordWSString。@VTT new并不总是引发异常,这取决于实现,以及new是否已被重写。如果它创建了第三方类型,我会在一个新的@CodeGorilla之后检查ptr==null。如果分配失败,则未标记为非抛出的默认和自定义分配函数都需要抛出与std::bad_alloc匹配的异常。使用不符合此要求的自定义分配函数和/或检查未标记为非抛出的运算符new的返回值是未定义的行为。