OVH Cloud OVH Cloud

[Debutant] Probleme de destruction

120 réponses
Avatar
Yoxoman
Bonjour à tous.

Je me permet de vous soumettre ce petit programme, qui représente en
gros la partie qui me pose problème d'un truc plus gros :

#include <iostream>

using namespace std;

class Vecteur
{
public:
double *val;
int taille;

Vecteur() {}
Vecteur(int i);
~Vecteur() {cout << "detruit" << endl; delete[] val;}

Vecteur foisDeux();
Vecteur &operator=(const Vecteur &v);
};

Vecteur::Vecteur(int i)
{
taille=i;
val=new double[i];
}

Vecteur Vecteur::foisDeux()
{
Vecteur temp(taille);

for (int i=0; i<taille; i++)
{
temp.val[i]=2*val[i];
}

return temp; //(1)
}

Vecteur &Vecteur::operator=(const Vecteur &v)
{
taille=v.taille;
val=new double[taille];

for (int i=0; i<taille; i++)
{
val[i]=v.val[i];
}

return *this;
}

int main(void)
{
Vecteur v1(3);
Vecteur v2;

v2=v1.foisDeux(); //(2)

return 0;
}

Segmentation fault.
J'ai tout d'abord eu du mal à identifier le problème, mais j'ai réussi
grâce à des supers pouvoirs hérités de Goldorak.
En fait, à la fin de la fonction foisDeux(), la variable temporaire
temp est détruite. Logique. En même temps, la fonction renvoie une
copie de l'objet, qui possède donc dans ses attributs un pointeur sur
une zone mémoire inaccessible (action du delete[]). Problème donc à la
destruction de ce dernier.

En fait, je ne sais pas trop comment arranger ce problème. Je ne
voudrais pas modifier *directement* les attributs de v1 dans la
fonction foisDeux(), pour garder ce vecteur en stock.

Merci d'avance pour votre aide.

10 réponses

Avatar
Gabriel Dos Reis
"Alain Naigeon" writes:

| a écrit dans le message news:
|
|
| > Et comme j'ai déjà dit par ailleurs, apprendre à conduire avec une
| > boîte
| > automatique avant de conduire avec une boîte manuelle n'est pas
| > forcement une mauvaise politique.
|
| *pas forcément*, ok, voilà une expression méritoire et nécessaire !
| J'ai l'impression qu'aux USA on est absolument convaincu qu'on
| ne peut s'en sortir avec une boîte manuelle, et ça n'empêche pas

Je ne sais pas. Tout ce que je sais, c'est qu'il est difficile de
faire des généralisations aux US à l'emporte pièce sans tomber dans
une trappe ou une autre. Par exemple, je vois parmi les étudiants que
nous avons ici, il y a pas d'entre eux qui ne jurent que par le manuel
-- alors que la plupart des étudiants européens conduisent plutôt des
automatiques.

| des centaines de millions d'Européens de conduire ainsi tous les
| jours.
|
| Il y a une vingtaine d'années, un ministre des transports (par ailleurs
| plutôt bon) avait mandaté une commission d'experts pour voir si
| on pouvait décider l'obligation, en ville, de rouler le soir avec les
| feux de croisement au lieu des simples feux de position. Ces doctes
| experts avaient conclu que c'était déraisonnable. Or il se trouve :
| - que la tradition, depuis toujours en Alsace, était de rouler ainsi !

vive l'Alsace et le Texas ! ;-)

| - qu'aujourd'hui il est question d'imposer cela *en plein jour* !

Comme chez nos amis belges ?

[...]

| A peu de choses près ce qu'on m'avait répondu pour le pointeurs
| il y a quelque temps (ok, pour un débutant... mais quand même !).
| A ce sujet, et dans ce contexte, me permettrai-je d'ajouter que
| répondre "prôner l'étude des pointeurs pour apprendre le C++
| d'aujourd'hui, c'est comme si on demandait d'étudier l'assembleur
| pour faire du C", voilà exactement un raisonnement par analogie !
|
| (ce n'était pas une réponse de James, qui, je crois, a une position
| plus nuancée, c'était une réponse de Gaby, entre autres - l'argu-

Pardon ?

| ment est revenu plus d'une fois. Quoiqu'il en soit, sur usenet en
| général, et sur ce groupe, je réagis à des idées, pas à des personnes).

et toussa.

-- Gaby
Avatar
Loïc Joly
wrote:
Mais qu'est-ce que tu suggères comme exemple
pour enseigner ces choses -- l'exemple classique, dans le temps, était
précisement une classe de String. Mais si on dit qu'il faut les
apprendre avant d'apprendre la gestion dynamique de la mémoire (et moi
aussi, je crois que c'est le cas), qu'est-ce qui sert d'exemple ?


Je crois que Gaby avait suggéré une classe de fractions, à une époque.
Ca me semble un exemple intéressant.

--
Loïc

Avatar
Gabriel Dos Reis
Loïc Joly writes:

| wrote:
| Mais qu'est-ce que tu suggères comme exemple
| > pour enseigner ces choses -- l'exemple classique, dans le temps, était
| > précisement une classe de String. Mais si on dit qu'il faut les
| > apprendre avant d'apprendre la gestion dynamique de la mémoire (et moi
| > aussi, je crois que c'est le cas), qu'est-ce qui sert d'exemple ?
|
| Je crois que Gaby avait suggéré une classe de fractions, à une
| époque. Ca me semble un exemple intéressant.

Il faudra que je cherche dans mes archives ce que j'avais fait avec
cette classe à l'époque -- je me souviens cependant l'avoir utilisée
pour introduire la notion d'invariants et les contrôles d'accès, mais
cela semble être un sujet un peu différent.

Pour une raison que je n'arrive pas encore à expliquer, les débutants
semblent souvent digérer assez rapidement la notion de sémantique par
valeur -- string, complex<double>, vector<>, ...

Pour leur faire apprécier la notion de copie-et-affectation, en
général je vais dans la direction opposée, où la notion de copie ou
affection devient floue ou problématique -- les flux en sont un
exemple classique ; on peut aussi considérer les serveurs (puisque
James aime ça :-)). Dans ces cas-ci, on a donc des examples où il est
question gérer des ressources communes et où on veut interdire la
copie. C'est assez simple à implémenter -- cela permet aussi de
reviser les contrôles d'accès. Ensuite, je vais graduellement sur les
terrains où cela a un sens d'autoriser la copie mais avec la
sémantique du programmeur, shared_ptr...

-- Gaby
Avatar
Alain Naigeon
"Gabriel Dos Reis" a écrit dans le message
news:

"Alain Naigeon" writes:
| Il y a une vingtaine d'années, un ministre des transports (par ailleurs
| plutôt bon) avait mandaté une commission d'experts pour voir si
| on pouvait décider l'obligation, en ville, de rouler le soir avec les
| feux de croisement au lieu des simples feux de position. Ces doctes
| experts avaient conclu que c'était déraisonnable. Or il se trouve :
| - que la tradition, depuis toujours en Alsace, était de rouler ainsi !

vive l'Alsace et le Texas ! ;-)


Encore un de mes préjugés qui tombe : le Texas est donc l'un des états
les plus éclairés du pays :-)

| A peu de choses près ce qu'on m'avait répondu pour le pointeurs
| il y a quelque temps (ok, pour un débutant... mais quand même !).
| A ce sujet, et dans ce contexte, me permettrai-je d'ajouter que
| répondre "prôner l'étude des pointeurs pour apprendre le C++
| d'aujourd'hui, c'est comme si on demandait d'étudier l'assembleur
| pour faire du C", voilà exactement un raisonnement par analogie !
|
| (ce n'était pas une réponse de James, qui, je crois, a une position
| plus nuancée, c'était une réponse de Gaby, entre autres - l'argu-

Pardon ?


Dans mon souvenir, tu faisais partie des gens qui avaient dit ça,
mais je me suis donc trompé, et je constate avec plaisir que tu
ne considère pas ça comme un argument.

--

Français *==> "Musique renaissance" <==* English
midi - facsimiles - ligatures - mensuration
http://anaigeon.free.fr | http://www.medieval.org/emfaq/anaigeon/
Alain Naigeon - - Strasbourg, France

Avatar
Gabriel Dos Reis
"Alain Naigeon" writes:

[...]


Il y a une vingtaine d'années, un ministre des transports (par ailleurs
plutôt bon) avait mandaté une commission d'experts pour voir si
on pouvait décider l'obligation, en ville, de rouler le soir avec les
feux de croisement au lieu des simples feux de position. Ces doctes
experts avaient conclu que c'était déraisonnable. Or il se trouve :
- que la tradition, depuis toujours en Alsace, était de rouler ainsi !
- qu'aujourd'hui il est question d'imposer cela *en plein jour* !
Comme quoi certaines "preuves", quoique non analogiques, sont
des doubles fraudes (personnellement j'emploierais plutôt "erreurs",
qui est moins blessant - est-ce que dialoguer avec quelqu'un qu'on
croit de mauvaise foi, ce n'est pas manifester qu'on aime perdre
son temps ? ;-) )

Lors d'un séjour au Canada, j'avais remarqué des dizaines de feux
"stop" allumés devant moi dans les files d'attentes aux feux rouges.
J'ai alors fait le lien avec une adecdote survenue quand j'ai loué la
voiture ; pendant les quelques explications reçues justement sur la
boîte automatique, j'ai demandé au gars à quoi servait la position
"0" (le point mort, vu après coup dans une notice de la boîte à gants) ;
il m'a répondu "à rien" :-)


| > | A peu de choses près ce qu'on m'avait répondu pour le pointeurs
| > | il y a quelque temps (ok, pour un débutant... mais quand même !).
| > | A ce sujet, et dans ce contexte, me permettrai-je d'ajouter que
| > | répondre "prôner l'étude des pointeurs pour apprendre le C++
| > | d'aujourd'hui, c'est comme si on demandait d'étudier l'assembleur
| > | pour faire du C", voilà exactement un raisonnement par analogie !
| > |
| > | (ce n'était pas une réponse de James, qui, je crois, a une position
| > | plus nuancée, c'était une réponse de Gaby, entre autres - l'argu-
| >
| > Pardon ?
|
| Dans mon souvenir, tu faisais partie des gens qui avaient dit ça,
| mais je me suis donc trompé, et je constate avec plaisir que tu
| ne considère pas ça comme un argument.

Non, non, reprenons. Tu affirmes quelque chose et j'aimerais savoir
exactement dans quel contexte je l'ai dit -- je ne dis pas que tu t'es
trompé ou non. Car, tu sais, je trouve que c'est de la fraude que
d'affirmer que Machin Chose des transports a mis en place une
commission Théodule et qu'au vu de cela on devrait faire ceci ou cela
en ce qui concerne l'enseignement de la programmation avec C++, sans
avoir au préalable expliqué la pertitence de Machin Chose des
transports ou la commision Théodule en question avec l'enseignement de
la programmation avec C++.


Pour ma part, je ne vois pas le rapport entre ce que faisaient
traditionnellement le Cro Magno de l'Alsace (ou du Texas) et ses
descendants sur la route avec l'enseignement de la programmation avec
C++. Si cela te semble si évident, tu ne devrais pas avoir de mal à
l'articuler clairement ; c'est la n-ième fois que je pose la
question. Toujours pas de réponse, à part comment les Alsaciens et les
Canadiens conduisent.

(En passant, même avec une transmission manuelle, je trouve plutôt
saine d'avoir le pied sur le frein au feu rouge, même si on est au
point mort.)

-- Gaby
Avatar
Alain Naigeon
"Gabriel Dos Reis" a écrit dans le message
news:

Pour leur faire apprécier la notion de copie-et-affectation, en
général je vais dans la direction opposée, où la notion de copie ou
affection devient floue ou problématique -- les flux en sont un
exemple classique ; on peut aussi considérer les serveurs (puisque
James aime ça :-)). Dans ces cas-ci, on a donc des examples où il est
question gérer des ressources communes et où on veut interdire la
copie. C'est assez simple à implémenter -- cela permet aussi de
reviser les contrôles d'accès. Ensuite, je vais graduellement sur les
terrains où cela a un sens d'autoriser la copie mais avec la
sémantique du programmeur, shared_ptr...


AMHA, en pédagogie, l'analogie peut être utile !
Je connais peu de gens qui ne comprenent pas au bout d'une minute
qu'en effaçant une icône de liens sur leur "desktop" ils n'effacent pas
l'objet sur le disque. Et la notion de travailler à plusieurs, soit sur un
même document, soit sur des copies fait comprendre beaucoup de
choses aussi, concernant l'avenir des informations détenues par chacun,
et aussi la différence entre égalité et identité, etc. On peut dire aussi
que
la taille ou le contenu d'une étiquette d'adresse sur une lettre ne disent
rien sur la taille ou sur la destruction de la maison située à cette
adresse,
etc. Utilisées par quelqu'un qui sait ce qu'il fait (et qui détient donc
de vraies preuves par ailleurs), ces analogies peuvent être poussées assez
loin, et ma petite expérience à moi c'est qu'elles rendent la notion de
pointeur pas aussi échevelée que certains le disent...

--

Français *==> "Musique renaissance" <==* English
midi - facsimiles - ligatures - mensuration
http://anaigeon.free.fr | http://www.medieval.org/emfaq/anaigeon/
Alain Naigeon - - Strasbourg, France

Avatar
Gabriel Dos Reis
"Alain Naigeon" writes:

| "Gabriel Dos Reis" a écrit dans le message
| news:
|
| > Pour leur faire apprécier la notion de copie-et-affectation, en
| > général je vais dans la direction opposée, où la notion de copie ou
| > affection devient floue ou problématique -- les flux en sont un
| > exemple classique ; on peut aussi considérer les serveurs (puisque
| > James aime ça :-)). Dans ces cas-ci, on a donc des examples où il est
| > question gérer des ressources communes et où on veut interdire la
| > copie. C'est assez simple à implémenter -- cela permet aussi de
| > reviser les contrôles d'accès. Ensuite, je vais graduellement sur les
| > terrains où cela a un sens d'autoriser la copie mais avec la
| > sémantique du programmeur, shared_ptr...
|
| AMHA, en pédagogie, l'analogie peut être utile !

Une analogie est bienvenue chose lorsqu'elle est pertinente et que le
lien est bien établi. Et dans de telles circonstances, on pourrait
même s'en passer. Mais dans le cas qui nous occupe, il ne s'agit pas
d'analogie en pédagogie, mais dans un raisonnement.

Et de fait, lorsque j'ai cité « shared_ptr », j'avais mis « (le
dernier qui sort éteind la lumière) » -- mais je trouve le concept
mieux illustré lorsqu'on le fait sur un exemple (e.g. ton document
partagé) ; et dans ce cas, je peux me passer de l'analogie :-)


| loin, et ma petite expérience à moi c'est qu'elles rendent la notion de
| pointeur pas aussi échevelée que certains le disent...

La question est : est-ce que tu comprends vraiment ce que « certains
disent » ? Mon petit doigt me dit que non. Je serais heureux de
constater qu'il se trompe...

-- Gaby
Avatar
Alain Naigeon
"Gabriel Dos Reis" a écrit dans le message
news:
"Alain Naigeon" writes:
| Dans mon souvenir, tu faisais partie des gens qui avaient dit ça,
| mais je me suis donc trompé, et je constate avec plaisir que tu
| ne considère pas ça comme un argument.

Non, non, reprenons. Tu affirmes quelque chose et j'aimerais savoir
exactement dans quel contexte je l'ai dit -- je ne dis pas que tu t'es
trompé ou non.


Y aurait-il un malentendu ? Quand je dis "je me suis trompé", ça veut
exactement dire : je reconnais que toi, Gaby, tu n'avais pas dit les
propos que je croyais pouvoir t'attribuer. Donc quel est le problème
qui subsiste, et pourquoi me mets-tu au défi de retrouver ce propos
de toi, puisque j'ai reconnu que tu ne l'avais pas tenu ! Je ne comprends
pas...


Pour ma part, je ne vois pas le rapport entre ce que faisaient
traditionnellement le Cro Magno de l'Alsace (ou du Texas) et ses
descendants sur la route avec l'enseignement de la programmation avec
C++. Si cela te semble si évident, tu ne devrais pas avoir de mal à
l'articuler clairement ; c'est la n-ième fois que je pose la
question. Toujours pas de réponse, à part comment les Alsaciens et les
Canadiens conduisent.


Ca c'est un autre argument-like, que tu avais donc utilisé, celui-là.
Mais, note-le, il est lui aussi extérieur au langage, ce n'est pas non
plus une preuve au sens où tu l'entends. Grosso modo, ça fonctionne
ainsi : il est bien connu que les anciens pensent que de leur temps
c'était mieux, que les nouveautés c'est pas bien parce que ça les
dérange, etc ; donc c'est ringard de penser ainsi, etc. Mais ça c'est
un argument humain, avec connotation presque moralisante, ce
n'est pas un argument technique. Et si il faut un argument technique
pour prouver quelque chose, alors il faut aussi un argument technique
pour le réfuter !

Ceci dit, il est bien évident que l'obsession de la technique, à laquelle
du tiens, est ici un peu intempestive, dans la mesure où il est question
d'apprentissage, qui fait forcément appel à des facteurs humains. Je
pense personnellement que le chemin suivi contribue à la perception
en profondeur d'une notion, même s'il est vrai qu'on peut parfaitement
utiliser quotidiennement plein de choses (comme la stl) en lisant juste
un mode d'emploi purement fonctionnel.

--

Français *==> "Musique renaissance" <==* English
midi - facsimiles - ligatures - mensuration
http://anaigeon.free.fr | http://www.medieval.org/emfaq/anaigeon/
Alain Naigeon - - Strasbourg, France

Avatar
Gabriel Dos Reis
"Alain Naigeon" writes:

| "Gabriel Dos Reis" a écrit dans le message
| news:
| > "Alain Naigeon" writes:
| > | Dans mon souvenir, tu faisais partie des gens qui avaient dit ça,
| > | mais je me suis donc trompé, et je constate avec plaisir que tu
| > | ne considère pas ça comme un argument.
| >
| > Non, non, reprenons. Tu affirmes quelque chose et j'aimerais savoir
| > exactement dans quel contexte je l'ai dit -- je ne dis pas que tu t'es
| > trompé ou non.
|
| Y aurait-il un malentendu ? Quand je dis "je me suis trompé", ça veut

Non, tu as dit "je me suis *donc* trompé" -- l'emphase est mienne.

Ce que je voudrais comprendre, c'est toute la suite d'évènements qui
t'a amené à penser que j'ai dit quelque chose (que je ne refute ni
n'infirme pas d'ailleurs) et ta subite retraction. Parce que les deux
sont tombés pouf comme ça.

| exactement dire : je reconnais que toi, Gaby, tu n'avais pas dit les
| propos que je croyais pouvoir t'attribuer. Donc quel est le problème

et comment tu en es sûr ?

| qui subsiste, et pourquoi me mets-tu au défi de retrouver ce propos
| de toi, puisque j'ai reconnu que tu ne l'avais pas tenu ! Je ne comprends
| pas...

Voir ci haut. Je suppose que quand tu avais tenu ton premier propos,
tu avais un début d'ombre de soupçons. Il a suffi que je dise
« Pardon ? » pour qu'il s'évanouisse ? Brrr, c'est flippant.

| >
| > Pour ma part, je ne vois pas le rapport entre ce que faisaient
| > traditionnellement le Cro Magno de l'Alsace (ou du Texas) et ses
| > descendants sur la route avec l'enseignement de la programmation avec
| > C++. Si cela te semble si évident, tu ne devrais pas avoir de mal à
| > l'articuler clairement ; c'est la n-ième fois que je pose la
| > question. Toujours pas de réponse, à part comment les Alsaciens et les
| > Canadiens conduisent.
|
| Ca c'est un autre argument-like, que tu avais donc utilisé, celui-là.

Pardon ?

| Mais, note-le, il est lui aussi extérieur au langage, ce n'est pas non
| plus une preuve au sens où tu l'entends. Grosso modo, ça fonctionne

et comment tu penses que je l'entends ?

| ainsi : il est bien connu que les anciens pensent que de leur temps
| c'était mieux, que les nouveautés c'est pas bien parce que ça les
| dérange, etc ; donc c'est ringard de penser ainsi, etc. Mais ça c'est

Ah ?

| un argument humain, avec connotation presque moralisante, ce
| n'est pas un argument technique. Et si il faut un argument technique
| pour prouver quelque chose, alors il faut aussi un argument technique
| pour le réfuter !

Mais, pourquoi refuter lorsque le simple questionnement suffit à coincer
le raisonnement ? :-)

| Ceci dit, il est bien évident que l'obsession de la technique, à laquelle

Je crois que l'obsédé est question se trouve entre ta chaise et ton clavier.

| du tiens, est ici un peu intempestive, dans la mesure où il est question
| d'apprentissage, qui fait forcément appel à des facteurs humains. Je

Je crois que tu t'es perdu quelque part : un raisonnement a été fait,
basé sur une analogie. J'ai questionné et demandé simplement que la
pertinence de l'analogie soit montrée. Cela n'a rien à avoir avec
l'apprentissage.

-- Gaby
Avatar
Alain Naigeon
"Gabriel Dos Reis" a écrit dans le message
news:

"Alain Naigeon" writes:
| loin, et ma petite expérience à moi c'est qu'elles rendent la notion de
| pointeur pas aussi échevelée que certains le disent...

La question est : est-ce que tu comprends vraiment ce que « certains
disent » ? Mon petit doigt me dit que non. Je serais heureux de
constater qu'il se trompe...


Mais c'est sûr que, par rapport à toi, je suis un débutant, et je ne doute
pas
que tu trouverais des exemples où ma compréhension serait en défaut. Est-ce
que ça prouve pour autant que ce que j'ai acquis ne vaut rien ? Par rapport
à quelqu'un qui n'a jamais vu de pointeur (ou qui a du mal à les comprendre,
j'ai connu des gens comme ça, par ailleurs pas du tout mauvais), là je ne
suis pas un débutant.

Il y a autre chose : je n'ai pas pris l'initiave de reprendre ce débat ; il
se
trouve que, cette fois-ci, c'est quelqu'un (Olivier) qui, à vue de nez, a
une expérience, y compris professionnelle. Peut-être même est-il chef
de projet (?), et je me demande si ce n'était ton secret espoir quand
tu as balancé une remarque sur les mauvais chefs de projets ;-)
Alors bon, je suis sûr que ton expérience d'enseignement est positive,
mais toi tu sembles avoir du mal à admettre que d'autres fonctionnent
aussi. Parce que, dire à l'un qu'il n'en sait pas assez, et à l'autre que
c'est
peut-être un mauvais professionnel, ce ne sont pas des preuvres avec
un contenu technique, c'est juste une dévalorisation de l' "adversaire",
c'est à dire qu'on postule justement ce qui reste à prouver. Et puis, je
répète, savoir qu'une approche ou une autre va aller à une personne,
ce n'est pas une question uniquement technique, il y des gens qui
comprennent mieux d'une façon, et d'autres d'une autre façon.
Je pourrais te citer plein d'exemples dans d'autres domaines, mais ce
ne seraient que des analogies à tes yeux. Le dialogue est difficile car,
étant évidemment l'un des plus forts ici, en C++, tu peux à tout moment
invoquer l'incompétence de l'autre ; d'autre part, en refusant de transposer
un argument d'un autre domaine, tu te mets totalement à l'abri, et le
débat est donc verrouillé ;-)

--

Français *==> "Musique renaissance" <==* English
midi - facsimiles - ligatures - mensuration
http://anaigeon.free.fr | http://www.medieval.org/emfaq/anaigeon/
Alain Naigeon - - Strasbourg, France