Je suis confronté à une corruption de la mémoire et à un blocage lors de l'exécution d'une chaîne de caractères. L'accident ne se produit pas dans la première fois de traitement. Il faut plus d'une heure pour s'écraser. Le problemmaticLa corruption de la mémoire lors de la tokenisation de chaîne
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;
}
Lorsque diagonized avec DebugDiag et l'analyse de la décharge créée, elle a souligné une autre ligne dans le code. (Parfois la ligne sera delete query
). J'ai donc retiré le query
comme pointeur et déclaré comme wstring. Et j'ai supprimé l'initialisation de headStr
et tableName
entre wcstok et boucle while (code comme ci-dessous).
wstring tmpQuery = inQry;
wchar_t *Tok = wcstok((wchar_t*)tmpQuery.c_str(), L" ");
while(Tok != NULL)
{
vectorSQLEntry.push_back(Tok);
Tok = wcstok(NULL, L" ");
}
Avec ce code, le blocage ne se produit pas. Alors, quel est le problème avec le code initial? Cet accident m'a traîné plus de deux jours.
Que détient 'vectorSQLEntry'? Quel est le type exact? – StoryTeller
définition vectorisée - vector vectorSQLEntry; –
Lorsque vous rencontrez des problèmes de corruption de mémoire, vous devez également démontrer que Valgrind n'a pas pu identifier les problèmes. Dans le cas contraire, il semble que vous n'ayez pas essayé. –