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
drkm
"Jean-Noël Mégoz" writes:

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

Avatar
Horst Kraemer
On Mon, 17 May 2004 01:37:06 +0200, "Jean-Noël Mégoz"
wrote:

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

Avatar
Alexandre
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.

Avatar
Alexandre
bonjour,

Petite question :
Imaginons une classe C


une classe C++ je suppose,

dont un des membres T est un tableau d'objets,


un pointeur je suppose, utilisé comme un tableau dynamique.

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.

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.

Avatar
Jean-Noël Mégoz
"Alexandre" a écrit dans le message de
news:40c18b8a$0$7698$
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é.

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.



Avatar
Fabien LE LEZ
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.

--
;-)
FLL, Epagneul Breton


Avatar
Alain Naigeon
"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...

--

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



Avatar
kanze
"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[].
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




Avatar
Matthieu Moy
writes:

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.


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

Avatar
Alain Naigeon
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 ! 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).


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 - - Strasbourg, France





1 2