OVH Cloud OVH Cloud

Pourquoi ca marche ?

5 réponses
Avatar
nico
Salut,

Je ne comprends pas pourquoi ca s'execute sans problème et surtout que ca
renvoie ca :

32
64
0
64
33
65
12
48
33
65
12
48
123



#include <iostream>

int main(int argc, char ** argv)
{

int * t = new int[2];

t[0]=32;
t[1]=64;

std::cout << t[0] << std::endl << t[1] << std::endl;

delete[] t;

std::cout << t[0] << std::endl << t[1] << std::endl;

int i = 12;
int j = 48;

t[0]=33;
t[1]=65;


std::cout << t[0] << std::endl << t[1] << std::endl;

std::cout << i << std::endl << j << std::endl;

t[2] = 123;

std::cout << t[0] << std::endl << t[1] << std::endl;

std::cout << i << std::endl << j << std::endl;

std::cout << t[2] << std::endl ;
}

Y a t-il des memory leak ? si oui, ou ?

Merci.

--
nico

5 réponses

Avatar
Jean-Marc Bourguet
nico writes:

Je ne comprends pas pourquoi ca s'execute sans problème et surtout que ca
renvoie ca :


A partir du moment ou il y a des comportements indefinis, il n'y a pas
grand chose a comprendre.
delete[] t;

std::cout << t[0] << std::endl << t[1] << std::endl;


Tu accedes a de la memoire que tu as liberees, c'est pas autorise.

t[2] = 123;


Tu accedes a de la memoire pas allouee, c'est pas autorise.


Y a t-il des memory leak ? si oui, ou ?


Non, ce que tu fais est plus grave.

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org

Avatar
nico
Salut,

A partir du moment ou il y a des comportements indefinis, il n'y a pas
grand chose a comprendre.
delete[] t;

std::cout << t[0] << std::endl << t[1] << std::endl;


Tu accedes a de la memoire que tu as liberees, c'est pas autorise.


Oui je sais mais je m'attendais à un segmentation fault

t[2] = 123;


Tu accedes a de la memoire pas allouee, c'est pas autorise.


idem

Y a t-il des memory leak ? si oui, ou ?


Non, ce que tu fais est plus grave.


ok ouf :)

Merci.

--
nico


Avatar
Jean-Marc Bourguet
nico writes:

Salut,

A partir du moment ou il y a des comportements indefinis, il n'y a pas
grand chose a comprendre.
delete[] t;

std::cout << t[0] << std::endl << t[1] << std::endl;


Tu accedes a de la memoire que tu as liberees, c'est pas autorise.


Oui je sais mais je m'attendais à un segmentation fault


En pratique la memoire est toujours allouee a ton processus, donc
tu peux toujours ecrire dedans et la lire. Mais tu risques de
demolir des structures de donnees de la bibliotheque (par exemple
celle gere new/malloc) ou les tiennes (si elle t'a ete reallouee
pour autre chose).

t[2] = 123;


Tu accedes a de la memoire pas allouee, c'est pas autorise.


idem


De meme, la memoire est generalement allouee en deux temps: de l'OS a
la bibliotheque et de la bibliotheque au programme. Dans les deux
cas, il y a des chances pour que la quantite de memoire allouee soit
arrondie (de l'OS a la bibliotheque, c'est generalement par page,
de la bibliotheque au programme, c'est par une unite telle que
- les zones sont toujours bien allignees pour tous les types
- il y a toujours moyen de mettre les structures necessaires pour
gerer l'allocation,
en pratique ca fait generalement au moins 2 pointeurs.)

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org



Avatar
nico
En pratique la memoire est toujours allouee a ton processus, donc
tu peux toujours ecrire dedans et la lire. Mais tu risques de
demolir des structures de donnees de la bibliotheque (par exemple
celle gere new/malloc) ou les tiennes (si elle t'a ete reallouee
pour autre chose).

t[2] = 123;


Tu accedes a de la memoire pas allouee, c'est pas autorise.


idem


De meme, la memoire est generalement allouee en deux temps: de l'OS a
la bibliotheque et de la bibliotheque au programme. Dans les deux
cas, il y a des chances pour que la quantite de memoire allouee soit
arrondie (de l'OS a la bibliotheque, c'est generalement par page,
de la bibliotheque au programme, c'est par une unite telle que
- les zones sont toujours bien allignees pour tous les types
- il y a toujours moyen de mettre les structures necessaires pour
gerer l'allocation,
en pratique ca fait generalement au moins 2 pointeurs.)

A+



OK merci pour les infos.

--
nico




Avatar
Marc Boyer
nico wrote:
Je ne comprends pas pourquoi ca s'execute sans problème et surtout que ca
renvoie ca :


Tu utilises de la mémoire que tu as libéré. Tant que personne ne
la réutilise, il n'y a pas de problème.
C'est un peu comme un hotel sans femme de ménage: si tu continues
à occuper ta chambre après l'avoir officiellement quitté, tant que
personne ne tente d'y entrer, ça va.

Marc Boyer
--
Je ne respecte plus le code de la route à vélo depuis une double fracture
due au fait que j'étais le seul à le respecter.