2017-06-22 8 views
-1

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.

+0

Que détient 'vectorSQLEntry'? Quel est le type exact? – StoryTeller

+0

définition vectorisée - vector vectorSQLEntry; –

+0

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é. –

Répondre

2

Votre instruction de suppression devrait être delete []query; Je m'attendrais à ce que vous manquiez de mémoire après un certain temps et que cela provoque probablement un échec et une panne.

0
if(query != NULL) 

La requête ne peut pas être nulle car new lèvera une exception si elle échoue.

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

Vous essayez d'écrire dans une chaîne de mémoire endommagée en lecture seule.

+0

"Vous essayez d'écrire dans la chaîne de corruption de mémoire en lecture seule." - Mais avec ce code je dint obtenir un accident ..! Est-ce que tu veux dire, si j'accède au tmpQuery après cette ligne j'obtiendrai une exception? –

+0

@Sel_va Techniquement rien n'empêche 'wcstok' de se bloquer tout de suite. Ni c-style ni const-cast ne devraient apparaître dans votre code. Et cette pièce ne nécessite absolument aucun moulage. Aussi, vous devriez mettre à jour votre question pour inclure [mvce] (https://stackoverflow.com/help/mcve). Selon le type 'vectorSQLEntry' et tout ce qui se passe avant/après, vous pouvez avoir des problèmes différents. – VTT

+0

Le type de vecteur est wstring. Je viens de remplir le vecteur avec des chaînes à jetons et de rechercher un mot et de renvoyer ce mot (wstring) de cette fonction. –

0

J'ai le même problème et j'ai trouvé la bonne façon de le résoudre. Vous n'avez pas initialisé la variable query correcte. Votre code est:

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

Le troisième paramètre n'est pas correct. Vous devez modifier tout comme le code de suivi:

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

Ensuite, il fonctionnera normalement.