OVH Cloud OVH Cloud

delete d'un tableau d'objets

20 réponses
Avatar
Jean-Noël Mégoz
Salut !

Petite question :
Imaginons une classe C dont un des membres T est un tableau d'objets,
instances d'une autre classe.
Le destructeur :
C::~C()
{
delete[] T;
}
est-il suffisant pour que les destructeurs des objets contenus dans T soient
appelés eux aussi ?
Ou faut-il que je prévoie une boucle pour détruire chacun de ces objets,
avant le "delete[] T;" ?

J.No.

10 réponses

1 2
Avatar
Fabien LE LEZ
On Mon, 7 Jun 2004 11:09:22 +0200, "Alain Naigeon"
wrote:

Mais AMHA il y a un problème d'accès à la STL ; franchement,
pour un débutant, s'y plonger et discerner dans tout ça ce qui utile et
simple dans un premier temps, c'est pas évident !


C'est le rôle d'un bon cours/livre de C++, qui aborde std::string et
std::vector au tout début, et le reste au fur et à mesure.

--
;-)
FLL, Epagneul Breton

Avatar
Fabien LE LEZ
On Mon, 7 Jun 2004 11:09:22 +0200, "Alain Naigeon"
wrote:

et pour ma part mon esprit se refuse à utiliser
un outil sans en connaître le fonctionnement.


Hé bé ! S'il faut avoir de très bonnes notions d'électronique pour
étudier en détail le fonctionnement du processeur, de la carte mère,
etc., et de très bonnes notions d'informatique pour comprendre le
fonctionnement de l'OS et du compilateur, le tout avant même de
commencer l'apprentissage du C++, on n'est pas sorti...

Avatar
Fabien LE LEZ
On Mon, 7 Jun 2004 11:09:22 +0200, "Alain Naigeon"
wrote:

Ne serait-ce que du fait que je n'ai pas besoin de m'occuper de delete,
y compris en cas d'exception.



Là je suis un peu embarassé, évidemment, vu que tu donnes le seul
exemple où l'usage de delete n'est pas évident (pour moi) ;-)
Hormis ce cas


Euh... tu as vu beaucoup de cas, toi, où le code entre un "new" et le
"delete" correspondant est garanti "nothrow" ?

--
;-)
FLL, Epagneul Breton


Avatar
kanze
"Alain Naigeon" wrote in message
news:<40c43952$0$21558$...
a écrit dans le message news:

"Alain Naigeon" wrote in message
news:<40c232d5$0$21568$...
"Fabien LE LEZ" a écrit dans le message news:

On Sat, 5 Jun 2004 11:34:15 +0200, "Jean-Noël Mégoz"
wrote:

Et puis, pour ne pas t'embeter avec tout ça, définis T comme un
vector et non un pointeur/tableau dynamique.


Bon conseil sans doute, mais je n'ai pas encore mis le nez dans
la STL.


Ben il vaut mieux t'y mettre tout de suite, c'est nettement plus
simple que les histoires d'allocation dynamique.


Euh... question de goût...


Euh... Oui et non.

Si on parle de toute la STL, avec les algorithmes, les binder, etc.,
oui. C'est une question de goût. Moi-même, elle ne m'emballe pas
particulièrement non plus.

En revanche, si on ne parle que de std::vector, non. Je ne crois pas
que c'est réelement une question de goût -- l'utilisation de
std::vector<T> *est* nettement plus simple, et indiscutablement
préférable, à new T[].


Je suis d'accord que std:vector std:list std:map sont pratiques et
d'usage plutôt simple. Mais AMHA il y a un problème d'accès à la STL ;
franchement, pour un débutant, s'y plonger et discerner dans tout ça
ce qui utile et simple dans un premier temps, c'est pas évident !


Je suis tout à fait d'accord. Le but de mon posting, c'était en fait de
suggérer qu'ils parlaient de deux choses différentes. Ça commence,
« utilise std::vector<T>, plutôt que T[] » auquel on a répondu : « mais
la STL, je ne le connais pas », suivi de « mais il faut ». Or, AMHA, le
premier conseil est bon, indépendamment de la STL, en tant qu'ensemble,
et même si std::vector fait bel et bien partie de la STL. Il ne faut pas
rejeter la partie simple parce qu'on a peur de la partie compliquée.

Dans certains cas j'ai préféré me refaire moi-même certains types
(nombres avec limites, par exemple) plutôt que d'essayer de comprendre
tous les détails de certaines "usines à gaz" de la STL. Et puis je
trouve qu'elle est plus tournée vers l'implémentation que vers
l'abstraction, mais ceci est un autre débat (encore que... on trouve
plus simple ce qui correspond plus à ses goûts personnels,
évidemment).


Je suis tout à fait d'accord avec toi, là.

Ne serait-ce que du fait que je n'ai pas besoin de m'occuper de
delete, y compris en cas d'exception.


Là je suis un peu embarassé, évidemment, vu que tu donnes le seul
exemple où l'usage de delete n'est pas évident (pour moi) ;-) Hormis
ce cas, je ne vois guère de problème avec new et delete. L'essentiel
est d'adopter une politique claire quant à la "propriété" des objets
alloués. Mais certaines questions récentes ici même ont montré, il me
semble, que cette question se pose *aussi* quand on utilise la STL,
alors...

Et puis, surtout : crois-tu sincèrement que quelqu'un qui n'a pas une
expérience *concrète* avec new et delete sera à l'aise dans sa lecture
des fichiers de la STL ??


Qui lit les fichiers de la STL ? Moi, je ne les régarde jamais. Pour
commencer, il suffit d'utiliser std::vector comme un tableau classique,
c-à-d :

std::vector< int > vi( 100 ) ;
for ( size_t i = 0 ; i < vi.size() ; ++ i ) {
vi[ i ] = i ;
}

etc. Assez rapidement, je crois, on peut y ajouter push_back -- c'est
drôlement commode. (Évidemment, il faut choisir : ou push_back, ou des
itérateurs qui marchent. Mais au moins d'être fou de la STL, on se passe
bien des itérateurs sur des tableaux.)

La pédagogie ne peut être dogmatique, il faut accepter les différences
d'approche chez les élèves (dont moi), et pour ma part mon esprit se
refuse à utiliser un outil sans en connaître le fonctionnement. Je
suis fait ainsi, c'est peut-être un défaut, mais le dépassement de cet
état ne peut passer que par son acception provisoire (belle phrase,
hein ?).


Si je prenais cette attitude, je ne pourrais pas me servir des
templates, parce que je ne sais pas trop comment le compilateur s'en
débrouille. Et si tu es capable de comprendre comment le compilateur
implémente les templates, je t'assure, std::vector ne te posera pas de
problème.

--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34






Avatar
Loïc Joly
Alain Naigeon wrote:

Là je suis un peu embarassé, évidemment, vu que tu donnes le seul
exemple où l'usage de delete n'est pas évident (pour moi) ;-)
Hormis ce cas, je ne vois guère de problème avec new et delete.
L'essentiel est d'adopter une politique claire quant à la "propriété"
des objets alloués. Mais certaines questions récentes ici même
ont montré, il me semble, que cette question se pose *aussi*
quand on utilise la STL, alors...


La question se pose aussi.

Par contre, une fois cette question répondue, la STL facilite dans
certains cas la mise en place de ce choix. Les pointeurs intelligents
vont encore plus loins dans cette démarche.

--
Loïc

Avatar
Alain Naigeon
"Fabien LE LEZ" a écrit dans le message news:

On Mon, 7 Jun 2004 11:09:22 +0200, "Alain Naigeon"
wrote:

et pour ma part mon esprit se refuse à utiliser
un outil sans en connaître le fonctionnement.


Hé bé ! S'il faut avoir de très bonnes notions d'électronique pour
étudier en détail le fonctionnement du processeur, de la carte mère,
etc., et de très bonnes notions d'informatique pour comprendre le
fonctionnement de l'OS et du compilateur, le tout avant même de
commencer l'apprentissage du C++, on n'est pas sorti...


En citant des points plus éloignés de notre problème que celui que
je donnais, tu crées un paradoxe et te facilites la réponse. Ce qui
veut dire que mon propos est de plus en plus vrai à mesure qu'on
se rapproche de la discussion, à savoir new-delete comme ingrédient
essentiel de pratiquement tout dans la STL.
Ceci dit, je me souviens qu'avoir connu le nombre de cycles pris par
"fetch, decode, execute" sur un HP 2000 n'était pas sans intérêt lors
du calcul de transformées de Fourier en temps réel (signal d'EEG).
C'était, de toute évidence, un cas particulier, ne me fais pas dire,
cette fois encore, ce que je n'ai pas dit ;-)
Et si on te demande, tout bêtement, pourquoi tant de "binaire",
tu parleras forcément d'électronique, ou alors... pour ne rien dire :-)

--

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


Avatar
Fabien LE LEZ
On Mon, 7 Jun 2004 23:04:10 +0200, "Alain Naigeon"
wrote:

En citant des points plus éloignés de notre problème que celui que
je donnais


Je reconnais que l'exemple de James est nettement meilleur, mais le
propos est le même. De même que je n'ai jamais regardé les sources de
mon compilo pour savoir comment la gestion des templates est
implémentée, de même je n'ai jamais regardé les sources de la STL.
Bon, OK, pas tout à fait jamais, j'ai tenté une ou deux fois de lire
le code en question, pour pallier à un manque de documentation, mais
j'ai vite abandonné. Et pourtant j'utilise std::vector<> tous les
jours.

--
;-)
FLL, Epagneul Breton

Avatar
Fabien LE LEZ
On Mon, 7 Jun 2004 23:04:10 +0200, "Alain Naigeon"
wrote:

Ceci dit, je me souviens qu'avoir connu le nombre de cycles pris par
"fetch, decode, execute" sur un HP 2000 n'était pas sans intérêt lors
du calcul de transformées de Fourier en temps réel (signal d'EEG).
C'était, de toute évidence, un cas particulier


... et même pris à l'envers : en C++, l'optimisation vient une fois
qu'on a terminé le programme et qu'on a pu se rendre compte de
l'emplacement des goulots d'étranglement ;-)

--
;-)
FLL, Epagneul Breton

Avatar
Alain Naigeon
"Fabien LE LEZ" a écrit dans le message news:

On Mon, 7 Jun 2004 23:04:10 +0200, "Alain Naigeon"
wrote:

Ceci dit, je me souviens qu'avoir connu le nombre de cycles pris par
"fetch, decode, execute" sur un HP 2000 n'était pas sans intérêt lors
du calcul de transformées de Fourier en temps réel (signal d'EEG).
C'était, de toute évidence, un cas particulier


... et même pris à l'envers : en C++, l'optimisation vient une fois
qu'on a terminé le programme et qu'on a pu se rendre compte de
l'emplacement des goulots d'étranglement ;-)


Je te rassure, en Fortran c'est pareil, puisque c'en était ;-)
C++ n'en était même pas à la blédine premier âge, je crois.

--

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


Avatar
Fabien LE LEZ
On Tue, 8 Jun 2004 22:49:52 +0200, "Alain Naigeon"
wrote:

Je te rassure, en Fortran c'est pareil, puisque c'en était ;-)
C++ n'en était même pas à la blédine premier âge, je crois.


Moi non plus, si ça se trouve ;-)

--
;-)
FLL, Epagneul Breton

1 2