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

Memory corruption during string tokenizing

本文关键字:内存 损坏 字符串      更新时间:2023-10-16

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

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

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

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

if(query != NULL)

查询不能为 null,因为如果失败new将引发异常。

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

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

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

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

第三个参数不正确。您应该像以下代码一样修改它:

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

然后它将正常工作。