OVH Cloud OVH Cloud

Heu, problème de pointeur où... (âge, fatigue...)

30 réponses
Avatar
Arnold McDonald \(AMcD\)
Voici une heure que je sèche sur ce truc...

J'ai une table de chaînes :

PTCHAR tab[] = { TEXT("yo"),TEXT("yi!") };

Bien, je veux modifier les chaînes de cette table. Donc...

PTCHAR p = new TCHAR[20];
PTCHAR q = new TCHAR[25];

lstrcpy(p,TEXT("héhé"));
lstrcpy(q,TEXT("hum!"));

Bon, ici, mes chaînes sont créées. Changeons celles de tab[].

tab[0] = p;
tab[1] = q;

Bien, bien bien. Le soft tourne, OK (comment pourrait-il en être autrement
vu la "difficulté"...).

Mais voici, en fin d'application, je dois désallouer les chaînes créées
(soyons propre). Je fais donc :

delete [] tab[0];
delete [] tab[1];

ben non, ça plante... Un beau "heap corruption detected".

Un delete tab[0] ne vaudrait guère mieux :-). Est-ce la fatigue qui fait que
je ne vois pas où j'oublie quelque chose ?

10 réponses

1 2 3
Avatar
Arnold McDonald \(AMcD\)
Sylvain wrote:

Généralement ? Il existe des centaines d'algorithmes qui laissent la
taille inchangée, du clair et du chiffré.





des algos de permutation dignes de petit manuel initiatique alors :)))



Un simple masque jetable est incassable. Bon, évidemment, pour des chaînes
constantes...

--
Arnold McDonald (AMcD)

http://arnold.mcdonald.free.fr/
Avatar
Vincent Burel
"Arnold McDonald (AMcD)" wrote in message
news:464383a1$0$23637$
Sylvain wrote:

> ceci est trivial pour Arnold

Laisse tomber, Vincent est en fait jaloux. Ce n'est qu'un


technicien/codeur
de traitement du son, tu sais. Deux, trois timer, un petit contrôle
graphique, voilà son univers. Je le soupçonne même d'utiliser des DLLs
propriétaires. Pouah.

Gnhihihihi.



ouai ! :-)

En tout cas moi , je ne fais pas de "new TCHAR[20];" quel horreur !!
Déjà allouer de la mémoire pour 20 octets, faut pas s'aimer :-) alors en
plus avec un "new". Beurk.
Avatar
Bertrand Lenoir-Welter
Vincent Burel wrote:

Déjà allouer de la mémoire pour 20 octets, faut pas s'aimer :-) alors en
plus avec un "new". Beurk.



Ouais mais avec le zéro terminal, ça fait 21 octets. Et là, on comprend
mieux l'allocation dynamique. Arnold n'est pas un technicien/codeur mais
un artiste/esthète, faut-il le rappeler ?
Avatar
Vincent Burel
"Bertrand Lenoir-Welter" <bertrand-dot-2007-at-galaad-dot-net> wrote in
message news:46444102$0$27371$
Vincent Burel wrote:
>
> Déjà allouer de la mémoire pour 20 octets, faut pas s'aimer :-) alors en
> plus avec un "new". Beurk.

Ouais mais avec le zéro terminal, ça fait 21 octets. Et là, on comprend
mieux l'allocation dynamique. Arnold n'est pas un technicien/codeur mais
un artiste/esthète, faut-il le rappeler ?



Alors, si c'est de l'art ! je m'incline :-)
Avatar
Arnold McDonald \(AMcD\)
Vincent Burel wrote:

En tout cas moi , je ne fais pas de "new TCHAR[20];" quel horreur !!



C'est vrai que c'est laid. Mais je rappelle que j'ai posté du code "arrangé"
pour illustrer le problème. T'es fou toi, j'utilise pas new() moi. Je fais
plutôt :

PTCHAR p = NULL;

if ( NULL != ( p =
(PTCHAR)GlobalAlloc(GPTR,(lstrlen(chaine_chiffree)+1)*sizeof(TCHAR) ) ) )
{
}

C'est quand même bien plus lisible et compréhensible qu'un :

new TCHAR[lstrlen(chaine_chiffree)+1];

qui, au passage, en interne, doit pas être bien loin de l'instruction avec
GlobalAlloc().

J'ai dit "plutôt" hein. En vrai, j'utilise VirtualAlloc(), HeapAlloc() et
cie. Restons simple.

--
Arnold McDonald (AMcD)

http://arnold.mcdonald.free.fr/
Avatar
Vincent Burel
"Arnold McDonald (AMcD)" wrote in message
news:464455da$0$785$
Vincent Burel wrote:

> En tout cas moi , je ne fais pas de "new TCHAR[20];" quel horreur !!

C'est vrai que c'est laid. Mais je rappelle que j'ai posté du code


"arrangé"
pour illustrer le problème. T'es fou toi, j'utilise pas new() moi. Je fais
plutôt :

PTCHAR p = NULL;

if ( NULL != ( p > (PTCHAR)GlobalAlloc(GPTR,(lstrlen(chaine_chiffree)+1)*sizeof(TCHAR) ) ) )
{
}

C'est quand même bien plus lisible et compréhensible qu'un :

new TCHAR[lstrlen(chaine_chiffree)+1];

qui, au passage, en interne, doit pas être bien loin de l'instruction avec
GlobalAlloc().

J'ai dit "plutôt" hein. En vrai, j'utilise VirtualAlloc(), HeapAlloc() et
cie. Restons simple.



ha ouai, moi en dessous de 8Ko j'alloue rien, et quand je veux jouer avec
une chaine je fais par exemple :
char sz[1024];

ca c'est simple ! :-)
Avatar
Arnold McDonald \(AMcD\)
Vincent Burel wrote:

char sz[1024];



Une valeur numérique !!! Mondieukelorreur ! Pourvu qu'un prof ne tombe pas
sur ton post...

--
Arnold McDonald (AMcD)

http://arnold.mcdonald.free.fr/
Avatar
Sylvain
Arnold McDonald (AMcD) wrote on 11/05/2007 13:39:

Je fais plutôt :

p = (PTCHAR)GlobalAlloc(GPTR,(lstrlen(chaine_chiffree)+1)*sizeof(TCHAR))))



euh, strdup fonctionne assez bien, non ?
même avec le CRT de VC95 ... et de 4.2

Sylvain.
Avatar
Arnold McDonald \(AMcD\)
Sylvain wrote:

euh, strdup fonctionne assez bien, non ?
même avec le CRT de VC95 ... et de 4.2



Oui, ça marche, mais ça utilise LocalAlloc(). Et puis bon, quand tu vois une
instruction comme la précédente, tu penses vite à la désallocation, c'est
pas évident de prime abord avec strdup() (j'ai oublié quelques LocalFree()
dans mon existence par sa faute...).

--
Arnold McDonald (AMcD)

http://arnold.mcdonald.free.fr/
Avatar
Sylvain
Arnold McDonald (AMcD) wrote on 12/05/2007 00:52:

Oui, ça marche, mais ça utilise LocalAlloc(). Et puis bon, quand tu vois une
instruction comme la précédente, tu penses vite à la désallocation, c'est



je pense à l'allocation et désallocation en terme de nécessité
algorithmique, pas du tout en fonction de ce que pourrait évoquer le nom
des fonctions (ou méthodes) - les réflexes conditionnées à ces noms
interviennent seulement pour utiliser free() (et non delete ou
Global/Local/Free), en regard de strdup.

Sylvain.
1 2 3