Impossible de récupérer la taille d'un tableau dynamique, mais le free il la tro [Résolu]

Signaler
Messages postés
21
Date d'inscription
samedi 15 mars 2003
Statut
Membre
Dernière intervention
17 décembre 2005
-
Messages postés
21
Date d'inscription
samedi 15 mars 2003
Statut
Membre
Dernière intervention
17 décembre 2005
-
Bonjour tout le monde, je me suis posé la
question récemment, que l'on soit en c ou en c++ et qu'on utilise un new ou un
malloc pour faire une allocation de mémoire dynamique, il est impossible de
récupérer la taille d'un tableau, si l'on n'en a pas conservé une trace quelque
part. Il faut soit la conserver dans une variable, soit faire de l'arithmétique
avec les pointeurs, pour peux qu'on aille un pointeur vers la fin du tableau.






Mais, une fois qu'on a fini de faire joujou avec
notre beau tableau et qu'on appelle la fonction free ou delete[] pour libérer
la mémoire, c'est fonction n'aurait pas besoin de savoir la taille des tableau
a libérer ? Juste histoire de pas faire de grosses gaffes ? quand est-ce que le
programme 'sait' qu'il a fini de libérer la mémoire ? qu'il est au bout ? que
après c'est plus le tableau qu'on lui a attribué ? BREF est-ce que quelqu'un
sait ce qu'il y a à l'intérieur de cette fonction free ou delete[] (delete[] appelle free non ?) ??? n'y a-t-il pas un
'signe' a la fin du tableau, comme il y a un 0 à la fin d'une chaîne de
caractères ??? un truc un chose n'importe quoi mais quelque chose ?



Because c'est pas gentil de la part de l'ordi de pas nour rendre la taille du tableau snif snif !!!!



d'avance merci.

PS: ça m'empèche quand même pas de dormir la nuit hein !

8 réponses

Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
C'est logique de se poser cette question. En fait c'est le système qui garde ca en mémoire. On pourrait très bien y avoir accès, mais ce n'est pas le cas avec new et malloc. Par contre en Win32, HeapAlloc permet de faire une allocation de mémoire, et après tu peux connaitre la taille allouée avec HeapSize
Messages postés
1536
Date d'inscription
samedi 21 décembre 2002
Statut
Membre
Dernière intervention
24 mai 2009
2
Je pense a un truc, on pourrait peut etre faire une boucle avec une fonction IsBad****Ptr() pour aller jusqu'au bout de la zone allouée nan ? On avance de 4 octets a chaque itération, on verifie si cette zone est allouée...etc. Par contre, je sais pas si niveau perf c'est tres bien :|

+2(p - n)
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
Rien ne te dis que deux zones allouées séparément ne sont pas contiguës, donc je dirais non
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
Niveau perf, non ce serait pas très bien évidemment
Messages postés
1536
Date d'inscription
samedi 21 décembre 2002
Statut
Membre
Dernière intervention
24 mai 2009
2
Oui je n'avais pas pensé a ca

+2(p - n)
Messages postés
21
Date d'inscription
samedi 15 mars 2003
Statut
Membre
Dernière intervention
17 décembre 2005

Merci, [auteurdetail.aspx?ID=19734 vecchio56], je
n'avais pas pensé à aller voir dans les api win32, je crois que
désormais, si je suis en win32 j'allouerais de la mémoire par HeapAlloc
; je m'étonne juste que aucune bibliothèque n'aie pensé à ce problème,
c'est stupide de stocker une information quelque part et de ne pas
permetre de pouvoir, au moins la lire ;-)
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
C'est ca l'intérêt des classes du C++: un objet qui alloue de la mémoire a en général une propriété qui est utilisée pour connaitre la taille allouée (on peut le faire aussi avec des structures en C)
Messages postés
21
Date d'inscription
samedi 15 mars 2003
Statut
Membre
Dernière intervention
17 décembre 2005

Oui, je sais bien que les classes C++ on une méthode .size(), mais je
métonnais que ce ne soit pas directement prévu dans le language C car
la méthode .size() utilise une variable et donc de la mémoire en plus,
alors que l'information est déja stockée. Question optimisation même si
ce n'est qu'une variable, ce n'est pas terrible terrible !