wrote:wrote:
[...]Au fait, comment le GC sait-il qu'un objet peut être détruit ?
Ca, c'est le problème de l'implémentation, mais
généralement ca entraine certaines contraintes, par exemple
l'interdiction de faire de l'arithmetique de pointeur
(ceci-dit, je ne suis pas sûr que ce soit un mal
d'interdire cela! ;-)
D'où est-ce que tu as ça ? Parce que les collecteurs que je
connais permettent tous l'arithmétique sur des pointeurs.
(On aurait du mal à l'intérdire, étant donné la définition
de l'opérateur [].)
Pas toute l'arithmetique de pointeur : typiquement, les casts
depuis/vers void* sont interdits il me semble.
Ensuite pour utiliser l'opérateur [], si le GC fournit un
compactage du tas (et s'il peut donc déplacer les objets en
mémoire), il faut généralement "pinner" l'objet que l'on
souhaite déréférencer pendant que l'on effectue ses
opérations.
kanze@gabi-soft.fr wrote:
adebaene@club-internet.fr wrote:
[...]
Au fait, comment le GC sait-il qu'un objet peut être détruit ?
Ca, c'est le problème de l'implémentation, mais
généralement ca entraine certaines contraintes, par exemple
l'interdiction de faire de l'arithmetique de pointeur
(ceci-dit, je ne suis pas sûr que ce soit un mal
d'interdire cela! ;-)
D'où est-ce que tu as ça ? Parce que les collecteurs que je
connais permettent tous l'arithmétique sur des pointeurs.
(On aurait du mal à l'intérdire, étant donné la définition
de l'opérateur [].)
Pas toute l'arithmetique de pointeur : typiquement, les casts
depuis/vers void* sont interdits il me semble.
Ensuite pour utiliser l'opérateur [], si le GC fournit un
compactage du tas (et s'il peut donc déplacer les objets en
mémoire), il faut généralement "pinner" l'objet que l'on
souhaite déréférencer pendant que l'on effectue ses
opérations.
wrote:wrote:
[...]Au fait, comment le GC sait-il qu'un objet peut être détruit ?
Ca, c'est le problème de l'implémentation, mais
généralement ca entraine certaines contraintes, par exemple
l'interdiction de faire de l'arithmetique de pointeur
(ceci-dit, je ne suis pas sûr que ce soit un mal
d'interdire cela! ;-)
D'où est-ce que tu as ça ? Parce que les collecteurs que je
connais permettent tous l'arithmétique sur des pointeurs.
(On aurait du mal à l'intérdire, étant donné la définition
de l'opérateur [].)
Pas toute l'arithmetique de pointeur : typiquement, les casts
depuis/vers void* sont interdits il me semble.
Ensuite pour utiliser l'opérateur [], si le GC fournit un
compactage du tas (et s'il peut donc déplacer les objets en
mémoire), il faut généralement "pinner" l'objet que l'on
souhaite déréférencer pendant que l'on effectue ses
opérations.
On 11 Jul 2005 01:02:15 -0700, :[delete]
Du fait qu'elle sert à la fois à la durée de vie et à la
gestion de la mémoire, il s'avère qu'il faut l'appeler même
dans les cas (assez fréquents dans mon code, au moins) où
l'objet n'a rien de particulier à faire en fin de vie. C'est
du travail (et une source d'erreurs) en plus.
Il y a un point qui me gêne dans ce que tu dis : si l'objet
n'est pas un type de base, tu ne peux pas savoir si le
destructeur est vide ou pas (c'est un détail d'implémentation,
qui peut changer en cours de route). Donc, tu dois l'appeler
systématiquement, "au cas où".
Et franchement, si je suis responsable de la création de la
classe _et_ du code qui l'utilise, je préférerais encore
m'encombrer de quelques delete que de m'engager à ce que le
destructeur reste vide.
On 11 Jul 2005 01:02:15 -0700, kanze@gabi-soft.fr:
[delete]
Du fait qu'elle sert à la fois à la durée de vie et à la
gestion de la mémoire, il s'avère qu'il faut l'appeler même
dans les cas (assez fréquents dans mon code, au moins) où
l'objet n'a rien de particulier à faire en fin de vie. C'est
du travail (et une source d'erreurs) en plus.
Il y a un point qui me gêne dans ce que tu dis : si l'objet
n'est pas un type de base, tu ne peux pas savoir si le
destructeur est vide ou pas (c'est un détail d'implémentation,
qui peut changer en cours de route). Donc, tu dois l'appeler
systématiquement, "au cas où".
Et franchement, si je suis responsable de la création de la
classe _et_ du code qui l'utilise, je préférerais encore
m'encombrer de quelques delete que de m'engager à ce que le
destructeur reste vide.
On 11 Jul 2005 01:02:15 -0700, :[delete]
Du fait qu'elle sert à la fois à la durée de vie et à la
gestion de la mémoire, il s'avère qu'il faut l'appeler même
dans les cas (assez fréquents dans mon code, au moins) où
l'objet n'a rien de particulier à faire en fin de vie. C'est
du travail (et une source d'erreurs) en plus.
Il y a un point qui me gêne dans ce que tu dis : si l'objet
n'est pas un type de base, tu ne peux pas savoir si le
destructeur est vide ou pas (c'est un détail d'implémentation,
qui peut changer en cours de route). Donc, tu dois l'appeler
systématiquement, "au cas où".
Et franchement, si je suis responsable de la création de la
classe _et_ du code qui l'utilise, je préférerais encore
m'encombrer de quelques delete que de m'engager à ce que le
destructeur reste vide.
Merci beaucoup pour ces réponses toujours aussi détaillées !Pour les objets dynamiques, le C++ a une syntaxe
particulière, delete, qui s'occupe *aussi* de la gestion de
la mémoire. Du fait qu'elle sert à la fois à la durée de vie
et à la gestion de la mémoire, il s'avère qu'il faut
l'appeler même dans les cas (assez fréquents dans mon code,
au moins) où l'objet n'a rien de particulier à faire en fin
de vie. C'est du travail (et une source d'erreurs) en plus.
Oui, mais pour moi le GC justement se serait chargé, lorsque
l'objet serait devenu "inutile", de récupérer la mémoire, mais
après avoir appelé le destructeur. En fait, il jouait le rôle
du delete que l'on appelle au moment où l'on se rend compte
que notre variable devient inutile.
En fait, tous les destructeurs triviaux et les destructeurs se
chargeant juste de faire des libérations d'objets alloués à
l'intérieur de la classe en gros deviendraient obselètes, et
permettraient donc un moins grand nombre de fuites mémoire.
J'ai bien compris ?
et pour toutes ces types, on ferait l'économie du delete. Bref
je vais me plonger dans la FAQ pour comprendre toutes ces
subtilitées.
Merci beaucoup pour ces réponses toujours aussi détaillées !
Pour les objets dynamiques, le C++ a une syntaxe
particulière, delete, qui s'occupe *aussi* de la gestion de
la mémoire. Du fait qu'elle sert à la fois à la durée de vie
et à la gestion de la mémoire, il s'avère qu'il faut
l'appeler même dans les cas (assez fréquents dans mon code,
au moins) où l'objet n'a rien de particulier à faire en fin
de vie. C'est du travail (et une source d'erreurs) en plus.
Oui, mais pour moi le GC justement se serait chargé, lorsque
l'objet serait devenu "inutile", de récupérer la mémoire, mais
après avoir appelé le destructeur. En fait, il jouait le rôle
du delete que l'on appelle au moment où l'on se rend compte
que notre variable devient inutile.
En fait, tous les destructeurs triviaux et les destructeurs se
chargeant juste de faire des libérations d'objets alloués à
l'intérieur de la classe en gros deviendraient obselètes, et
permettraient donc un moins grand nombre de fuites mémoire.
J'ai bien compris ?
et pour toutes ces types, on ferait l'économie du delete. Bref
je vais me plonger dans la FAQ pour comprendre toutes ces
subtilitées.
Merci beaucoup pour ces réponses toujours aussi détaillées !Pour les objets dynamiques, le C++ a une syntaxe
particulière, delete, qui s'occupe *aussi* de la gestion de
la mémoire. Du fait qu'elle sert à la fois à la durée de vie
et à la gestion de la mémoire, il s'avère qu'il faut
l'appeler même dans les cas (assez fréquents dans mon code,
au moins) où l'objet n'a rien de particulier à faire en fin
de vie. C'est du travail (et une source d'erreurs) en plus.
Oui, mais pour moi le GC justement se serait chargé, lorsque
l'objet serait devenu "inutile", de récupérer la mémoire, mais
après avoir appelé le destructeur. En fait, il jouait le rôle
du delete que l'on appelle au moment où l'on se rend compte
que notre variable devient inutile.
En fait, tous les destructeurs triviaux et les destructeurs se
chargeant juste de faire des libérations d'objets alloués à
l'intérieur de la classe en gros deviendraient obselètes, et
permettraient donc un moins grand nombre de fuites mémoire.
J'ai bien compris ?
et pour toutes ces types, on ferait l'économie du delete. Bref
je vais me plonger dans la FAQ pour comprendre toutes ces
subtilitées.
Tu ne peux pas
faire n'importe quoi dans une classe dérivée.
Tu ne peux pas
faire n'importe quoi dans une classe dérivée.
Tu ne peux pas
faire n'importe quoi dans une classe dérivée.
Je me suis mal exprimé. L'appel automatique au destructeur en
C++/CLI ne s'effectue effectivement que sur les variables ayant une
portée locale (alloués sur la pile)
Je me suis mal exprimé. L'appel automatique au destructeur en
C++/CLI ne s'effectue effectivement que sur les variables ayant une
portée locale (alloués sur la pile)
Je me suis mal exprimé. L'appel automatique au destructeur en
C++/CLI ne s'effectue effectivement que sur les variables ayant une
portée locale (alloués sur la pile)
Dans le message 42d2cfa8$0$4961$,Je me suis mal exprimé. L'appel automatique au destructeur en
C++/CLI ne s'effectue effectivement que sur les variables ayant une
portée locale (alloués sur la pile)
Non, seulement ce qui ressemble à ça : les objets sont déclarés
comme sur la pile, mais le compilateur fait un new et un delete
(ou équivalent pour appeler le destructeur) à la sortie du bloc.
Oui, on est d'accord : syntaxiquemeent, c'est une variable locale, mais le
Dans le message 42d2cfa8$0$4961$636a15ce@news.free.fr,
Je me suis mal exprimé. L'appel automatique au destructeur en
C++/CLI ne s'effectue effectivement que sur les variables ayant une
portée locale (alloués sur la pile)
Non, seulement ce qui ressemble à ça : les objets sont déclarés
comme sur la pile, mais le compilateur fait un new et un delete
(ou équivalent pour appeler le destructeur) à la sortie du bloc.
Oui, on est d'accord : syntaxiquemeent, c'est une variable locale, mais le
Dans le message 42d2cfa8$0$4961$,Je me suis mal exprimé. L'appel automatique au destructeur en
C++/CLI ne s'effectue effectivement que sur les variables ayant une
portée locale (alloués sur la pile)
Non, seulement ce qui ressemble à ça : les objets sont déclarés
comme sur la pile, mais le compilateur fait un new et un delete
(ou équivalent pour appeler le destructeur) à la sortie du bloc.
Oui, on est d'accord : syntaxiquemeent, c'est une variable locale, mais le
On 12 Jul 2005 00:15:38 -0700, :Tu ne peux pas faire n'importe quoi dans une classe dérivée.
Je ne parle pas de classes dérivées, je parle de code qui
utilise la classe.
Si une classe quelconque a un destructeur vide dans sa version
1.0.0, qu'est-ce qui me prouve que son destructeur sera non
trivial dans sa version 1.0.1 ?
(La fonction "CloseHandle()" de l'API Win32 est une fonction
fourre-tout capable de fermer des fichiers, libérer des
ressources système, etc.)
On 12 Jul 2005 00:15:38 -0700, kanze@gabi-soft.fr:
Tu ne peux pas faire n'importe quoi dans une classe dérivée.
Je ne parle pas de classes dérivées, je parle de code qui
utilise la classe.
Si une classe quelconque a un destructeur vide dans sa version
1.0.0, qu'est-ce qui me prouve que son destructeur sera non
trivial dans sa version 1.0.1 ?
(La fonction "CloseHandle()" de l'API Win32 est une fonction
fourre-tout capable de fermer des fichiers, libérer des
ressources système, etc.)
On 12 Jul 2005 00:15:38 -0700, :Tu ne peux pas faire n'importe quoi dans une classe dérivée.
Je ne parle pas de classes dérivées, je parle de code qui
utilise la classe.
Si une classe quelconque a un destructeur vide dans sa version
1.0.0, qu'est-ce qui me prouve que son destructeur sera non
trivial dans sa version 1.0.1 ?
(La fonction "CloseHandle()" de l'API Win32 est une fonction
fourre-tout capable de fermer des fichiers, libérer des
ressources système, etc.)
(La fonction "CloseHandle()" de l'API Win32 est une fonction
fourre-tout capable de fermer des fichiers, libérer des
ressources système, etc.)
En somme, une fonction virtuelle:-).
(La fonction "CloseHandle()" de l'API Win32 est une fonction
fourre-tout capable de fermer des fichiers, libérer des
ressources système, etc.)
En somme, une fonction virtuelle:-).
(La fonction "CloseHandle()" de l'API Win32 est une fonction
fourre-tout capable de fermer des fichiers, libérer des
ressources système, etc.)
En somme, une fonction virtuelle:-).
a écrit dans le message de news:(La fonction "CloseHandle()" de l'API Win32 est une
fonction fourre-tout capable de fermer des fichiers,
libérer des ressources système, etc.)
En somme, une fonction virtuelle:-).
Tu me fais peur.
Et si M$ avait déposé un brevet sur la virtualité des fonctions ?
;-)
<kanze@gabi-soft.fr> a écrit dans le message de news:
1121238322.872261.243370@f14g2000cwb.googlegroups.com...
(La fonction "CloseHandle()" de l'API Win32 est une
fonction fourre-tout capable de fermer des fichiers,
libérer des ressources système, etc.)
En somme, une fonction virtuelle:-).
Tu me fais peur.
Et si M$ avait déposé un brevet sur la virtualité des fonctions ?
;-)
a écrit dans le message de news:(La fonction "CloseHandle()" de l'API Win32 est une
fonction fourre-tout capable de fermer des fichiers,
libérer des ressources système, etc.)
En somme, une fonction virtuelle:-).
Tu me fais peur.
Et si M$ avait déposé un brevet sur la virtualité des fonctions ?
;-)
a écrit dans le message de news:(La fonction "CloseHandle()" de l'API Win32 est une
fonction fourre-tout capable de fermer des fichiers,
libérer des ressources système, etc.)
En somme, une fonction virtuelle:-).
Tu me fais peur.
Et si M$ avait déposé un brevet sur la virtualité des fonctions ?
;-)Ils en auraient du mal. L'OS que j'ai écrit pour le 8086, en
1979, avait aussi des fonctions « fourre-toute », dont le
<kanze@gabi-soft.fr> a écrit dans le message de news:
1121238322.872261.243370@f14g2000cwb.googlegroups.com...
(La fonction "CloseHandle()" de l'API Win32 est une
fonction fourre-tout capable de fermer des fichiers,
libérer des ressources système, etc.)
En somme, une fonction virtuelle:-).
Tu me fais peur.
Et si M$ avait déposé un brevet sur la virtualité des fonctions ?
;-)
Ils en auraient du mal. L'OS que j'ai écrit pour le 8086, en
1979, avait aussi des fonctions « fourre-toute », dont le
a écrit dans le message de news:(La fonction "CloseHandle()" de l'API Win32 est une
fonction fourre-tout capable de fermer des fichiers,
libérer des ressources système, etc.)
En somme, une fonction virtuelle:-).
Tu me fais peur.
Et si M$ avait déposé un brevet sur la virtualité des fonctions ?
;-)Ils en auraient du mal. L'OS que j'ai écrit pour le 8086, en
1979, avait aussi des fonctions « fourre-toute », dont le