Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1569 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Allocation memoire C++

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Allocation memoire C++

n°1794161
smallGame
Posté le 01-10-2008 à 02:42:09  profilanswer
 

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
 
 
 
 

mood
Publicité
Posté le 01-10-2008 à 02:42:09  profilanswer
 

n°1794174
Taz
bisounours-codeur
Posté le 01-10-2008 à 08:28:19  profilanswer
 

utilise std::vector

n°1794175
Taz
bisounours-codeur
Posté le 01-10-2008 à 08:28:56  profilanswer
 

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

n°1794178
Joel F
Real men use unique_ptr
Posté le 01-10-2008 à 08:45:17  profilanswer
 

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

n°1794569
smallGame
Posté le 01-10-2008 à 19:13:31  profilanswer
 


 
 
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,

n°1794584
Joel F
Real men use unique_ptr
Posté le 01-10-2008 à 20:06:52  profilanswer
 

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

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

n°1794919
smallGame
Posté le 02-10-2008 à 18:10:47  profilanswer
 

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

n°1795481
Malkav
Posté le 03-10-2008 à 21:15:05  profilanswer
 

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
n°1795545
smallGame
Posté le 04-10-2008 à 00:27:28  profilanswer
 

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...

n°1795583
Joel F
Real men use unique_ptr
Posté le 04-10-2008 à 11:11:05  profilanswer
 

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
mood
Publicité
Posté le 04-10-2008 à 11:11:05  profilanswer
 

n°1795647
smallGame
Posté le 04-10-2008 à 18:26:13  profilanswer
 

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...
 
 

n°1795655
Joel F
Real men use unique_ptr
Posté le 04-10-2008 à 19:22:41  profilanswer
 

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
n°1795665
smallGame
Posté le 04-10-2008 à 20:08:03  profilanswer
 

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

n°1795685
Taz
bisounours-codeur
Posté le 04-10-2008 à 22:35:01  profilanswer
 

ouais les tableaux c'est génial

n°1959549
memspell
Posté le 22-01-2010 à 00:01:12  profilanswer
 

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
n°1959566
Joel F
Real men use unique_ptr
Posté le 22-01-2010 à 07:16:52  profilanswer
 

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

n°1959715
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 22-01-2010 à 14:28:22  profilanswer
 

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)

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Allocation memoire C++

 

Sujets relatifs
C++ et XNA[Résolu] Manipulation de dates par FILETIME et SYSTEMTIME
Help programme en C[C++ MFC] CFileDialog n'affiche pas les disques durs
[C/C++] Choisir sur quel processeur/coeur executer du code[C++] gestion de la mémoire pour une fonction renvoyant un pointeur
[C] Probleme avec un Pipe[c++] cherche cours / doc sur la gestion de la memoire
[ASPX] [C#] Chercher et afficher une ligne dans un fichier Excel 
Plus de sujets relatifs à : Allocation memoire C++


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR