Allocation memoire et initialisation par memset.

Allocation memoire et initialisation par memset. - C++ - Programmation

Marsh Posté le 03-07-2002 à 10:16:44    

Admettons que je veuille allouer d'un bloc 10* sizeof d'une structure.
 
donc un va dire  
 
truc->pipo = util_alloc_memory(10*sizeof(mastructure_pipo));
 
est-ce que je peux faire de facon safe juste apres :
 
memset ((void *) truc->pipo, 0, 10*sizeof(mastructure_pipo));
 
ou c'est pas safe ?
 
De meme si je fais  
 
truc->pipo = util_alloc_memory(sizeof(mastructure_pipo));
 
Est-ce que l'alloc memoire de truc->pipo sera faite de facon contigue ce qui me permettrait de faire le memset juste apres ?

Reply

Marsh Posté le 03-07-2002 à 10:16:44   

Reply

Marsh Posté le 03-07-2002 à 10:18:20    

T pas cool Joce, je retiens :/  :sweat:


---------------
Envie d'un bol d'air ? Traxxas Revo 3.3
Reply

Marsh Posté le 03-07-2002 à 10:23:39    

t'as pas continue a reflechir ??

Reply

Marsh Posté le 03-07-2002 à 10:24:32    

bin le malloc() en lui même te fait une allocation de mémoire contigue....
 
attention à tester le pointeur avec NULL pour savoir si le malloc() a échoué.
 
dans la pratique sous Windows, tu as 2Go d'espace mémoire par process, donc tu peux malloc() pour 2Go, ça partira dans le swap (si il en mode auto il grossira)....
 
le malloc() va te donner un bloc contigu, mais après "physiquement" le bloc peut peutêtre parsemé dans la ram physique et le swap, dû à la pagination utilisée par le mmu.

Reply

Marsh Posté le 03-07-2002 à 10:25:19    

joce a écrit a écrit :

t'as pas continue a reflechir ??




 
Ben si, mais dur dur :/
Tu veux vraiment pas m'aider ?
Je rame depuis qu'on c parlé  :sweat:


Message édité par Max Evans le 03-07-2002 à 10:25:45

---------------
Envie d'un bol d'air ? Traxxas Revo 3.3
Reply

Marsh Posté le 03-07-2002 à 10:26:11    

attention qu'on soit bien d'accord, ton truc->pipo ne pointes sur rien ?
 
si tu veux redimenssionner c'est realloc() obligatoirement, sinon ton ancien bloc mallocqué :D est perdu et tu as un memory leak....

Reply

Marsh Posté le 03-07-2002 à 10:28:31    

tu peux aussi utiliser calloc(), ça t'évitera de faire un memset() juste après, calloc() réservant un espace mémoire en initialisant son contenu à 0


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 03-07-2002 à 10:28:55    

et tu as calloc() qui te permet aussi d'allouer, et mettre à 0 automatiquent le bloc alloué.
 
PS: sous Unix/Linux, tout ce qui est alloué est mis à 0 par le noyau, et tout ce qui reallocqué en plus est mis à 0.
pour empêcher un process de scanner les données en mémoires.
 
sous Windows 9X la mémoire est en vrac (donc fo faire un memset), sous Windows NT je sais plus si le noyau fait un clean automatique à l'alloc.

Reply

Marsh Posté le 03-07-2002 à 10:29:17    

merde grillaid. :D

Reply

Marsh Posté le 03-07-2002 à 10:43:54    

je suis sous Solaris, HP et IBM

Reply

Marsh Posté le 03-07-2002 à 10:43:54   

Reply

Marsh Posté le 03-07-2002 à 10:48:01    

donc les blocs alloués sont très probablement effaçés par le noyau.

Reply

Marsh Posté le 04-07-2002 à 12:17:57    

bjone a écrit a écrit :

donc les blocs alloués sont très probablement effaçés par le noyau.




non y a souvent du garbage si c'est pas initialisé


---------------
Protèges carnets personnalisés & accessoires pour bébé
Reply

Marsh Posté le 05-07-2002 à 02:31:05    

1ère question
Je vois vraiment pas ce qui te fais penser que c'est peut-être pas sûr.
 
2ème:
Contiguë à quoi?
A l'allocation précédente ? Non.


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
Reply

Marsh Posté le 05-07-2002 à 08:11:46    

musaran a écrit a écrit :

1ère question
Je vois vraiment pas ce qui te fais penser que c'est peut-être pas sûr.
 
2ème:
Contiguë à quoi?
A l'allocation précédente ? Non.




non c'est juste que je savais pas si c'était contigü, maintenant c'est bon :D
Non c'était pas à l'alloc précédente :)


---------------
Protèges carnets personnalisés & accessoires pour bébé
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed