Fonction new() en C++
warriorkev
Messages postés
12
Date d'inscription
Statut
Membre
Dernière intervention
-
Char Snipeur Messages postés 9813 Date d'inscription Statut Contributeur Dernière intervention -
Char Snipeur Messages postés 9813 Date d'inscription Statut Contributeur Dernière intervention -
Bonjour,
Je me pose une question qui va sembler un peu idiote mais bon si je ne la pose pas, ca va me perturber.
Je voulais savoir comment sont gérés les NEW() en C++ et est-il possible de donné le même identificateur a 2 new() differents ?
Mes profs m'ont dit qu'un new() était une allocation de mémoire, je suis d'accord et qu'il était forcément impossilbe de donner le même identificateur.
exemple: ContratAssurance* p1 = new ContratAssurance();
ContratAssurance* p1 = new ContratAssurance();
J'ai testé et cela ne fonctionne pas donc CQFD
MAIS
j'ai créé 2 fonctions differentes :
void test1 (void)
{
cout << "(6) Test d'allocation dynamique" << endl;
ContratAssurance* p1 = new ContratAssurance();
}
void test2 (void)
{
cout << "(6) Test d'allocation dynamique" << endl;
ContratAssurance* p1 = new ContratAssurance();
}
et ces fonctions fonctionnent alors que mes identifiants on le même nom: p1 et que ces fonctions sont dans le même MAIN.
Quelqu'un aurait-il un explication ?
Merci d'avance
Kevin
Je me pose une question qui va sembler un peu idiote mais bon si je ne la pose pas, ca va me perturber.
Je voulais savoir comment sont gérés les NEW() en C++ et est-il possible de donné le même identificateur a 2 new() differents ?
Mes profs m'ont dit qu'un new() était une allocation de mémoire, je suis d'accord et qu'il était forcément impossilbe de donner le même identificateur.
exemple: ContratAssurance* p1 = new ContratAssurance();
ContratAssurance* p1 = new ContratAssurance();
J'ai testé et cela ne fonctionne pas donc CQFD
MAIS
j'ai créé 2 fonctions differentes :
void test1 (void)
{
cout << "(6) Test d'allocation dynamique" << endl;
ContratAssurance* p1 = new ContratAssurance();
}
void test2 (void)
{
cout << "(6) Test d'allocation dynamique" << endl;
ContratAssurance* p1 = new ContratAssurance();
}
et ces fonctions fonctionnent alors que mes identifiants on le même nom: p1 et que ces fonctions sont dans le même MAIN.
Quelqu'un aurait-il un explication ?
Merci d'avance
Kevin
4 réponses
Quand tu écris :
... l'erreur n'est pas dûe au fait que tu fais deux news pour initialiser p1, mais parce que tu déclares deux fois p1. Ainsi tu peux écrire :
... de la même façon qu'un pointeur peut accueillir successivement plusieurs malloc. Mais il ne faut pas perdre de vue que de la même façon qu'un malloc implique un free, un new implique un delete. Si tu ne sauves pas quelque part l'adresse retournée par le premier new, tu ne pourras plus le désallouer ce qui est dommage.
En fait ce que tu dois retenir c'est qu'un new peut être vue comme un malloc et un delete comme un free, et s'utilisent de la même façon.
Cependant, en C, en jouant sur les références, les constructeurs et la notion d'horizon tu peux souvent écrire un programme sans faire le moindre new et avec très peu de pointeurs.
Bonne chance
ContratAssurance* p1 = new ContratAssurance(); ContratAssurance* p1 = new ContratAssurance();
... l'erreur n'est pas dûe au fait que tu fais deux news pour initialiser p1, mais parce que tu déclares deux fois p1. Ainsi tu peux écrire :
ContratAssurance* p1 = new ContratAssurance(); p1 = new ContratAssurance();
... de la même façon qu'un pointeur peut accueillir successivement plusieurs malloc. Mais il ne faut pas perdre de vue que de la même façon qu'un malloc implique un free, un new implique un delete. Si tu ne sauves pas quelque part l'adresse retournée par le premier new, tu ne pourras plus le désallouer ce qui est dommage.
En fait ce que tu dois retenir c'est qu'un new peut être vue comme un malloc et un delete comme un free, et s'utilisent de la même façon.
Cependant, en C, en jouant sur les références, les constructeurs et la notion d'horizon tu peux souvent écrire un programme sans faire le moindre new et avec très peu de pointeurs.
Bonne chance
Je n'aime pas trop le mot d'identifiant, p1 est une variable, comme toute variable elle peut prendre plusieurs valeurs successives, mais en revanche doit être unique (c'est à dire déclaré une seule fois).
le new crée juste une plage de données fonction de ce qu'il lui est donné en argument (et exécute le constructeur le cas échéant), et retourne l'adresse de cet espace mémoire.
lorsque tu enchaîne plusieurs p1=new ... Le seul problème c'est que tu ne libères pas la mémoire de précédent new et que comme tu modifies la valeur de p1, tu ne sait plus comment y accéder.
le new crée juste une plage de données fonction de ce qu'il lui est donné en argument (et exécute le constructeur le cas échéant), et retourne l'adresse de cet espace mémoire.
lorsque tu enchaîne plusieurs p1=new ... Le seul problème c'est que tu ne libères pas la mémoire de précédent new et que comme tu modifies la valeur de p1, tu ne sait plus comment y accéder.
Merci de ta réponse mais il y a un truc que je pige pas.
Je suppose qu'en C++ et en C# c'est la même chose ? Mais j'ai vu un exemple de code où la personne avait fait un interface ou il y avait un bouton CREER et lorsqu'il appuyait sur le bouton, son code faisait un new() avec le même identifiant comme: p1 = new ContratAssurance();
A chaque fois ca créait un p1 mais normalement ce n'est pas sencé fonctionné.
Je suppose qu'en C++ et en C# c'est la même chose ? Mais j'ai vu un exemple de code où la personne avait fait un interface ou il y avait un bouton CREER et lorsqu'il appuyait sur le bouton, son code faisait un new() avec le même identifiant comme: p1 = new ContratAssurance();
A chaque fois ca créait un p1 mais normalement ce n'est pas sencé fonctionné.
Tes variables p1 sont locales aux fonctions crées, c'est à dire qu'elles seront inexistantes en sortant de tes fonctions -> le pointeur p1 est alloué sur la pile.
Par contre, la variable pointée par p1 existe toujours en sortant de ta fonction, car avec new() tu alloue de l'espace mémoire dans le tas.
exemple:
ContratAssurance* test ()
{
cout << "Test d'allocation dynamique" << endl;
ContratAssurance* p1 = new ContratAssurance();
return p1;
}
int main()
{
ContratAssurance* monpointeur = test();
//donc ici on a bien alloué en mémoire un contratAssurance, le pointeur p1 de test() a été détruit
//mais la variable créée est toujours existante, car elle a été allouée sur le tas.
ContratAssurance* unAutrePointeur = test();
//ca marche aussi
return 0;
}
j'espère que j'ai été clair :)
~• Coin Coin •~
Par contre, la variable pointée par p1 existe toujours en sortant de ta fonction, car avec new() tu alloue de l'espace mémoire dans le tas.
exemple:
ContratAssurance* test ()
{
cout << "Test d'allocation dynamique" << endl;
ContratAssurance* p1 = new ContratAssurance();
return p1;
}
int main()
{
ContratAssurance* monpointeur = test();
//donc ici on a bien alloué en mémoire un contratAssurance, le pointeur p1 de test() a été détruit
//mais la variable créée est toujours existante, car elle a été allouée sur le tas.
ContratAssurance* unAutrePointeur = test();
//ca marche aussi
return 0;
}
j'espère que j'ai été clair :)
~• Coin Coin •~