Allocation memoire C++

Allocation memoire C++ - C++ - Programmation

Marsh Posté le 01-10-2008 à 02:42:09    

Bonjour a tous,
 
J ai un problme pour alouer de la memoire dynamiquement, je ne comprend pas comment on fait durant l execution d un programme.
 
Biensur je n ai forcement aucun probleme si je le fait dans le constructeur:
 

Code :
  1. Test::Test() { t = new int[100];}


 
Par contre il me semble qu on ne peut pas faire:
 

Code :
  1. void Test::aloc() { t = new int[100]; }


 
sinon on perd ce qu on vient d alouer a la fin de la methode, de meme que:
 

Code :
  1. void Test::aloc(int t*) { t = new int[100]; }


 
Alors comment fait on pour allouer apres l appel du constructeur? C est forcement possible la STL le fait.
 
Je vous remercie,
 
Vincent
 
 
 
 

Reply

Marsh Posté le 01-10-2008 à 02:42:09   

Reply

Marsh Posté le 01-10-2008 à 08:28:19    

utilise std::vector

Reply

Marsh Posté le 01-10-2008 à 08:28:56    

et non tu fais un new, tu ne perds rien, sauf si tu ne gardes pas un pointeur dessus.

Reply

Marsh Posté le 01-10-2008 à 08:45:17    

si t est un membre de Test, tu ne perds rien ...
sinon oui hein, std::vector :o

Reply

Marsh Posté le 01-10-2008 à 19:13:31    


 
 
Merci, oui en effet je me suis rendu compte que ma question etait bete juste apres l avoir pose. Si t est membre je ne perd rien. J avais fait un test mais je devais avoir une autre erreur.
 
Par contre juste pour confirmer ceci ne marche pas, non:
 

Code :
  1. void Test::aloc(int* p)
  2. {
  3. p = new int[100];
  4. }
  5. // Dans une autre classe
  6. void Autre::meth()
  7. {
  8. int *p;
  9. Test test;
  10. test.aloc(p);
  11. p[99] = 0;
  12. }


 
A la sortie de la methode aloc le bloc est perdu, non?
 
Merci,

Reply

Marsh Posté le 01-10-2008 à 20:06:52    

bien sur tu passes ton pointeur par valeur.
Ceci fonctionne :
 

Code :
  1. void Test::aloc(int*& p) { p = new int[100]; }

Reply

Marsh Posté le 02-10-2008 à 18:10:47    

Merci tu me sors d un flou sur les allocations mémoire. J y vois plus clair maintenant.

Reply

Marsh Posté le 03-10-2008 à 21:15:05    

par contre après un 'new' il faut un delete à un moment donné sinon il y a fuite mémoire...
 
 
hummm et pq std::vector ? j'aime bien la STL mais même dans notre code au taff on a de bon vieux tableaux style char[50] ou int[100] avec des memcopy et memset un peu partout ;) (oui çà peut vous paraitre crade)

Message cité 1 fois
Message édité par Malkav le 03-10-2008 à 21:15:17
Reply

Marsh Posté le 04-10-2008 à 00:27:28    

Pour les fuites memoires je fais bien attention et je n´ai aucune difficulté avec ca, je te remercie pour ta mise en garde mais dans tout mon code un new pour un delete, du moins en principe :)
 
Bien sur , moi aussi j aime bien la stl, et je l´utilise a bon escient, par contre parfois je dois utiliser des donne brut a envoye a la carte graphique. Et puis personnellement j´adore jouer avec les pointeur, c´est pour moi un plus grand plaisir que la stl. Se déplacer dans la mémoire et retrouver les bonnes données.  
 
Ca me donne la nostalgie des bonnes listes chainées en C, c´est un vrai bonheur...

Reply

Marsh Posté le 04-10-2008 à 11:11:05    

Malkav a écrit :


hummm et pq std::vector ? j'aime bien la STL mais même dans notre code au taff on a de bon vieux tableaux style char[50] ou int[100] avec des memcopy et memset un peu partout ;) (oui çà peut vous paraitre crade)

 

Ouais non mais les mecs, si t'as besoin d'un tableau de taille fixe, fait un tableau de taille fixe :E Rien à redire
Aprés, vector c'ets pour l'aspect dynamqiue. Autre point néanmoins, tu peut pas passer de T[N] proprement par référence.
Donc vector en étant un vrai objet te permet de passer des tableaux par reference. La dessus, si tu as besoin de tableau
statique passable par réf, utilise boost::array<T,N>.

 
smallGame a écrit :

Bien sur , moi aussi j aime bien la stl, et je l´utilise a bon escient, par contre parfois je dois utiliser des donne brut a envoye a la carte graphique.

 

Par design, vector est contigu en mémoire et l'adresse de son premier élément est accesible par &v[0]. Et ca sc'ets un bête T* passable à des routines bas niveaux.

Message cité 1 fois
Message édité par Joel F le 04-10-2008 à 11:12:23
Reply

Marsh Posté le 04-10-2008 à 11:11:05   

Reply

Marsh Posté le 04-10-2008 à 18:26:13    

Joel F a écrit :


 
Par design, vector est contigu en mémoire et l'adresse de son premier élément est accesible par &v[0]. Et ca sc'ets un bête T* passable à des routines bas niveaux.


 
Je ne suis pas sur de comprendre ce que tu veux dire 1 ou 2:
 
1- Tous les élément T sont contigus en mémoire??? du genre:
T[0]T[1]T[2]....etc
Dans ce cas la je peux envoyé l'adresse de son premier élément est accesible par &v[0] et il lira tous les éléments...
 
2- Je pensais que c'était plutot du genre:
ptFirst->T[0]ptNext->T[1]ptNext->...etc
Par contre dans ce cas la ca marche pour un élément mais pas s'il y en a plusieurs;
 
 
Désolé pour ma représentation mémoire elle n'est pas top, je ne savais pas comment faire mieux.
 
1- implique que si vector n'a pas aloué assez d'espace mémoire a l'ajout du neme élément il doit alouer un plus gros bloc, copier tous les éléments qu il possédait dans ce nouveau bloc puis effacer l'ancien bloc mémoire, car il est impossible d'après ma connaissance d'agrandir un bloc mémoire.
 
En tout cas si ta réponse c'est 1 je trouve ca génial et je l'ignorais...
 
 

Reply

Marsh Posté le 04-10-2008 à 19:22:41    

Reponse 1oui en effet.

 

De ISO 14882, 2nd ed., 23.2.4 lib.vector:

Citation :


The elements of a vector are stored contiguously, meaning that if v
is a vector<T, Allocator> where T is some type
other than bool, then it obeys the identity &v[n] == &v[0] + n for all
0 <= n < v.size().


Ta représentation 2 c'ets celle de deque et de list en gros.


Message édité par Joel F le 04-10-2008 à 19:24:44
Reply

Marsh Posté le 04-10-2008 à 20:08:03    

Ok encore merci, tu m'apprends beaucoup de choses.

Reply

Marsh Posté le 04-10-2008 à 22:35:01    

ouais les tableaux c'est génial

Reply

Marsh Posté le 22-01-2010 à 00:01:12    

smallGame a écrit :


Désolé pour ma représentation mémoire elle n'est pas top, je ne savais pas comment faire mieux.

 

1- implique que si vector n'a pas aloué assez d'espace mémoire a l'ajout du neme élément il doit alouer un plus gros bloc, copier tous les éléments qu il possédait dans ce nouveau bloc puis effacer l'ancien bloc mémoire, car il est impossible d'après ma connaissance d'agrandir un bloc mémoire.

 

Trés bonne intuition pour un débutant, continue dans cette voie :)

Message cité 1 fois
Message édité par Harkonnen le 22-01-2010 à 14:28:43
Reply

Marsh Posté le 22-01-2010 à 07:16:52    

pas besoin de up de 2 ans pour faire du spam :o

Reply

Marsh Posté le 22-01-2010 à 14:28:22    

memspell a écrit :


 
Trés bonne intuition pour un débutant, continue dans cette voie :)


2 posts au compteur, un post qui n'apporte rien à part du spam... je pense qu'on se passera de tes services quelques temps [:papatte]


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

Sujets relatifs:

Leave a Replay

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