 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Jean-Noël Mégoz Guest
|
Posted: Sun May 16, 2004 11:37 pm Post subject: delete d'un tableau d'objets |
|
|
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.
|
|
| Back to top |
|
 |
drkm Guest
|
Posted: Mon May 17, 2004 12:05 am Post subject: Re: delete d'un tableau d'objets |
|
|
"Jean-Noël Mégoz" <nospam_jnmegoz (AT) infonie (DOT) fr> writes:
| Quote: | 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;" ?
|
class AClass
{
public:
AClass()
: myObjects( /* ... */ )
, myPointers( /* ... */ )
{
// ...
}
~AClass()
{
delete[] myObjects ;
for ( int i = 0 ; i < /* ... */ ; ++ i ) {
delete myPointers[ i ] ;
}
delete[] myPointers ;
}
private:
AType * myObjects ;
AType * * myPointers ;
} ;
--drkm
|
|
| Back to top |
|
 |
Horst Kraemer Guest
|
Posted: Mon May 17, 2004 8:37 am Post subject: Re: delete d'un tableau d'objets |
|
|
On Mon, 17 May 2004 01:37:06 +0200, "Jean-Noël Mégoz"
<nospam_jnmegoz (AT) infonie (DOT) fr> wrote:
| Quote: | 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 ?
|
Ce n'est ni suffisant ni insuffisant. C'est illégal. delete ne peut
être appliqué qu'à un pointeur. Un tableau n'est pas un pointeur.
Le destructeur de la classe X (la classe des éléments du tableau) est
appelé automatiquement pour tous les éléments du tableau T par le
destructeur ~C. Donc il n'y rien a faire dans ~C par rapport au
tableau T.
--
Horst
|
|
| Back to top |
|
 |
Alexandre Guest
|
Posted: Sat Jun 05, 2004 8:59 am Post subject: Re: delete d'un tableau d'objets |
|
|
| Quote: | Ce n'est ni suffisant ni insuffisant. C'est illégal. delete ne peut
être appliqué qu'à un pointeur. Un tableau n'est pas un pointeur.
|
je pense qu'il utilise T comme un tableau, mais qu'il est défini comme
pointeur, qq chose du genre
TRUC *T = new TRUC[taille];
et donc le delete[] suffit bien à appeler le destructeur ~TRUC pour chaque
élément du tableau.
|
|
| Back to top |
|
 |
Alexandre Guest
|
Posted: Sat Jun 05, 2004 9:00 am Post subject: Re: delete d'un tableau d'objets |
|
|
bonjour,
| Quote: | Petite question :
Imaginons une classe C
|
une classe C++ je suppose,
| Quote: | dont un des membres T est un tableau d'objets,
|
un pointeur je suppose, utilisé comme un tableau dynamique.
| Quote: | 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 ?
|
oui.
| Quote: | Ou faut-il que je prévoie une boucle pour détruire chacun de ces objets,
avant le "delete[] T;" ?
|
non.
Et puis, pour ne pas t'embeter avec tout ça, définis T comme un vector et
non un pointeur/tableau dynamique.
|
|
| Back to top |
|
 |
Jean-Noël Mégoz Guest
|
Posted: Sat Jun 05, 2004 9:34 am Post subject: Re: delete d'un tableau d'objets |
|
|
"Alexandre" <alex.g (AT) netcourrier (DOT) com> a écrit dans le message de
news:40c18b8a$0$7698$636a15ce (AT) news (DOT) free.fr...
| Quote: | bonjour,
Petite question :
Imaginons une classe C
une classe C++ je suppose,
|
Ici, C était censé être le nom de la classe, mais ça prêtait à confusion, en
effet. Désolé.
| Quote: | 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. |
|
|
| Back to top |
|
 |
Fabien LE LEZ Guest
|
Posted: Sat Jun 05, 2004 3:53 pm Post subject: Re: delete d'un tableau d'objets |
|
|
On Sat, 5 Jun 2004 11:34:15 +0200, "Jean-Noël Mégoz"
<nospam_jnmegoz (AT) infonie (DOT) fr> wrote:
| Quote: | 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.
--
FLL, Epagneul Breton
|
|
| Back to top |
|
 |
Alain Naigeon Guest
|
Posted: Sat Jun 05, 2004 8:43 pm Post subject: Re: delete d'un tableau d'objets |
|
|
"Fabien LE LEZ" <gramster (AT) gramster (DOT) com> a écrit dans le message news:
[email]m2r3c05pbu0cep4d0gudgtnau51stt0cn2 (AT) 4ax (DOT) com[/email]...
| Quote: | On Sat, 5 Jun 2004 11:34:15 +0200, "Jean-Noël Mégoz"
[email]nospam_jnmegoz (AT) infonie (DOT) fr[/email]> 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...
--
Français *==> "Musique renaissance" <==* English
midi - facsimiles - ligatures - mensuration
http://anaigeon.free.fr | http://www.medieval.org/emfaq/anaigeon/
Alain Naigeon - [email]anaigeon (AT) free (DOT) fr[/email] - Strasbourg, France
|
|
| Back to top |
|
 |
kanze@gabi-soft.fr Guest
|
Posted: Mon Jun 07, 2004 8:09 am Post subject: Re: delete d'un tableau d'objets |
|
|
"Alain Naigeon" <anaigeon (AT) free (DOT) fr> wrote
| Quote: | "Fabien LE LEZ" <gramster (AT) gramster (DOT) com> a écrit dans le message news:
[email]m2r3c05pbu0cep4d0gudgtnau51stt0cn2 (AT) 4ax (DOT) com[/email]...
On Sat, 5 Jun 2004 11:34:15 +0200, "Jean-Noël Mégoz"
[email]nospam_jnmegoz (AT) infonie (DOT) fr[/email]> 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[].
Ne serait-ce que du fait que je n'ai pas besoin de m'occuper de delete,
y compris en cas d'exception.
--
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
|
|
| Back to top |
|
 |
Matthieu Moy Guest
|
Posted: Mon Jun 07, 2004 8:14 am Post subject: Re: delete d'un tableau d'objets |
|
|
[email]kanze (AT) gabi-soft (DOT) fr[/email] writes:
| Quote: | 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
*est* nettement plus simple, et indiscutablement préférable, à new T[].
Ne serait-ce que du fait que je n'ai pas besoin de m'occuper de delete,
y compris en cas d'exception.
|
Faut faire gaffe quand même au « piège à c** » genre :
http://www-verimag.imag.fr/~moy/c_collection/vector.cpp
Mais sinon, c'est drôlement pratique !
--
Matthieu
|
|
| Back to top |
|
 |
Alain Naigeon Guest
|
Posted: Mon Jun 07, 2004 9:09 am Post subject: Re: delete d'un tableau d'objets |
|
|
<kanze (AT) gabi-soft (DOT) fr> a écrit dans le message news:
[email]d6652001.0406070009.165a7212 (AT) posting (DOT) google.com[/email]...
| Quote: | "Alain Naigeon" <anaigeon (AT) free (DOT) fr> wrote in message
news:<40c232d5$0$21568$626a14ce (AT) news (DOT) free.fr>...
"Fabien LE LEZ" <gramster (AT) gramster (DOT) com> a écrit dans le message news:
[email]m2r3c05pbu0cep4d0gudgtnau51stt0cn2 (AT) 4ax (DOT) com[/email]...
On Sat, 5 Jun 2004 11:34:15 +0200, "Jean-Noël Mégoz"
[email]nospam_jnmegoz (AT) infonie (DOT) fr[/email]> 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 ! 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).
| Quote: | 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 ?? 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 ?).
--
Français *==> "Musique renaissance" <==* English
midi - facsimiles - ligatures - mensuration
http://anaigeon.free.fr | http://www.medieval.org/emfaq/anaigeon/
Alain Naigeon - [email]anaigeon (AT) free (DOT) fr[/email] - Strasbourg, France
|
|
| Back to top |
|
 |
Fabien LE LEZ Guest
|
Posted: Mon Jun 07, 2004 12:35 pm Post subject: Re: delete d'un tableau d'objets |
|
|
On Mon, 7 Jun 2004 11:09:22 +0200, "Alain Naigeon" <anaigeon (AT) free (DOT) fr>
wrote:
| Quote: | 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
|
|
| Back to top |
|
 |
Fabien LE LEZ Guest
|
Posted: Mon Jun 07, 2004 12:38 pm Post subject: Re: delete d'un tableau d'objets |
|
|
On Mon, 7 Jun 2004 11:09:22 +0200, "Alain Naigeon" <anaigeon (AT) free (DOT) fr>
wrote:
| Quote: | 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...
|
|
| Back to top |
|
 |
Fabien LE LEZ Guest
|
Posted: Mon Jun 07, 2004 12:40 pm Post subject: Re: delete d'un tableau d'objets |
|
|
On Mon, 7 Jun 2004 11:09:22 +0200, "Alain Naigeon" <anaigeon (AT) free (DOT) fr>
wrote:
| Quote: | 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
|
|
| Back to top |
|
 |
kanze@gabi-soft.fr Guest
|
Posted: Mon Jun 07, 2004 3:50 pm Post subject: Re: delete d'un tableau d'objets |
|
|
"Alain Naigeon" <anaigeon (AT) free (DOT) fr> wrote
| Quote: | kanze (AT) gabi-soft (DOT) fr> a écrit dans le message news:
[email]d6652001.0406070009.165a7212 (AT) posting (DOT) google.com[/email]...
"Alain Naigeon" <anaigeon (AT) free (DOT) fr> wrote in message
news:<40c232d5$0$21568$626a14ce (AT) news (DOT) free.fr>...
"Fabien LE LEZ" <gramster (AT) gramster (DOT) com> a écrit dans le message news:
[email]m2r3c05pbu0cep4d0gudgtnau51stt0cn2 (AT) 4ax (DOT) com[/email]...
On Sat, 5 Jun 2004 11:34:15 +0200, "Jean-Noël Mégoz"
[email]nospam_jnmegoz (AT) infonie (DOT) fr[/email]> 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.
| Quote: | 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à.
| Quote: | 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.)
| Quote: | 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
|
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|