Bonjour à tous,

Dans l'une de mes méthodes, je recherche la valeur d'un champ d'une clé de registre Windows à l'aide de la fonction RegQueryValueExA (surchage de la fonction RegQueryValueEx).
J'appelle cette fonction deux fois, une première fois pour récupérer la taille du buffer, et une deuxième fois pour remplir ma variable (regValue).

Le problème que je rencontre, c'est que cette fonction Windows stocke les valeurs demandées en les séparant par un caractère de fin de chaine (\0). Du coup, pour récupérer toutes les valeurs, je fait comme ceci:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
// Read the REG_MULTI_SZ values - Get size of the buffer for the values
returnStatus = RegQueryValueExA(hKey, "NomChamp", NULL, NULL, NULL, &dwSize);
if(returnStatus != ERROR_SUCCESS)
{
	printf("Error reading the registry key");
	exit(1);
}
 
try { regValue = new char[dwSize+1]; }
catch(bad_alloc &ba) { printf("bad_alloc caught: %s\n", ba.what()); exit(EXIT_FAILURE); }
 
// Get the values
returnStatus = RegQueryValueExA(hKey, "NomChamp", NULL, NULL, (LPBYTE)regValue, &dwSize);
if(returnStatus != ERROR_SUCCESS)
{
	printf("Error getting the values of the registry key");
	exit(3);
}
 
// Put the values into the returnValues vector
for(; *regValue != '\0'; regValue += strlen(regValue)+1)
{
	char* itemValue = NULL;
	try { itemValue = new char[strlen(regValue)+1]; }
	catch(bad_alloc &ba) { printf("bad_alloc caught: %s\n", ba.what()); exit(EXIT_FAILURE); }
	strcpy(itemValue, regValue);
	returnValues.push_back(itemValue);
}
 
if(hKey) RegCloseKey(hKey);
if(regValue) delete[] regValue; // SEGFAULT précisément ici.
 
return returnValues;
Etant donné que je modifie l'emplacement du pointeur regValue pour parcourir son contenu, il pointe sur un emplacement vide après la boucle (mais pas égal à NULL).
Du coup, lorsque j'essaye de le delete, je me retrouve avec une segfault.

Mais il y a bien une fuite de mémoire, donc comment je peux supprimer ce pointeur?