在执行字符串标记化时,我面临内存损坏和崩溃。在第一次处理时没有发生崩溃。崩溃需要一个多小时。问题
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循环之间初始化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" ");
}
使用此代码不会发生崩溃。那么初始代码有什么问题?这次事故让我拖了两天多。
答案 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;
然后它会正常工作。