字符串标记化期间的内存损坏
Memory corruption during string tokenizing
我在进行字符串标记化时面临内存损坏和崩溃。第一次处理时未发生崩溃。崩溃需要一个多小时。问题所在
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" ");
}
使用此代码不会发生崩溃。!那么初始代码有什么问题呢?这次车祸拖了我两天多。
您的删除语句应该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;
然后它将正常工作。
相关文章:
- 如何针对特定情况调试和修复此双自由内存损坏问题
- 正在调试 malloc():新内存损坏
- 仅特定内核计数上的 MPI 内存损坏
- C++程序错误:malloc():内存损坏
- 调用std::函数成员时内存损坏
- C++ 内存损坏检测
- 由于标头中的 #define 不匹配而导致内存损坏
- C STD ::线程中的种族状况或内存损坏
- malloc()内存损坏仅通过为特定数量编写int数组
- 字符串标记化期间的内存损坏
- 从检测到 glibc 正常退出 - malloc():内存损坏
- 放置在外部 DLL 中的类中的字符串数据的内存损坏
- std :: string ::擦除会导致内存损坏
- 编译器如何检测内存损坏
- mix_playMusic导致内存损坏
- 在使用新操作员和C 中的结构的调用构造函数时,获得内存损坏(Malloc)
- 两个内联程序集调用与一个内联程序集调用中的内存损坏?
- 如何调试不确定内存损坏?
- 增强Dijkstra代码会导致片段内存损坏
- 内存损坏从vb.net调用c dll