Pour C# je dis pas, c'est vrai qu'il a des très bons points ce langage
Pour Java et ObjC+GC... tu sais sans doute ce que je pense du GC :P
Après en ObjC, le "il faut que le programmeur ait prévu le truc", c'est là qu'on voit la différence entre le programmeur du dimanche qui comprend pas trop les implications de ce qu'il fait et le programmeur de métier qui a fait de l'archi et respecte les conventions de nommage et les règles de gestion mémoire :P
Pour rebondir sur le sujet, il est parfois nécessaire d'implémenter un RefCounter, notamment pour QuickTime et CoreAudio.
Mais je n'arrive pas à une solution qui me satisfasse
J'ai une classe SmartObject qui gère donc un refCount, et une sous classe est créée pour chaque type d'objet, comme une MusicSequence QT ou une AudioUnit CoreAudio.
releaseSmartObject est une fonction abstraite de SmartObject qui est appelée quand le compteur passe à zéro. Seulement, je suis obligé de faire de même dans le destructeur de la sous classe: virtual ~SmartMusicSequence () { releaseSmartObject(); } C'est ballot, et de plus je dois tester le compteur ! Tout ça parce que dans le destructeur de SmartObject, je ne peux pas appeler la fonction releaseSmartObject, car le destructeur de la sous classe SmartMusicSequence a déjà été exécuté. Ca semble insoluble, mais si quelqu'un à une idée pour contourner le problème ça m'intéresse.
Pour illustrer la complexité du C++, voici le code de gestion du RefCounter:
4 objets sont créés et seulement deux refCount (s1 et s2)
On voit bien ici qu'en C++, gérer l'allocation automatique c'est relou !
En ObjC, on a que de l'allocation dynamique, ce qui simplifie bien les choses. Mais on a encore des trucs tordus comme on l'a vu au dessus.
A mon avis, dans l'avenir ce type de langage va disparaà®tre au profit de langage de type java, corroboré par le fait qu'à terme tous les OS tourneront dans une machine virtuelle.
Réponses
Pour Java et ObjC+GC... tu sais sans doute ce que je pense du GC :P
Après en ObjC, le "il faut que le programmeur ait prévu le truc", c'est là qu'on voit la différence entre le programmeur du dimanche qui comprend pas trop les implications de ce qu'il fait et le programmeur de métier qui a fait de l'archi et respecte les conventions de nommage et les règles de gestion mémoire :P
Mais je n'arrive pas à une solution qui me satisfasse
J'ai une classe SmartObject qui gère donc un refCount, et une sous classe est créée pour chaque type d'objet, comme une MusicSequence QT ou une AudioUnit CoreAudio.
Exemple:
releaseSmartObject est une fonction abstraite de SmartObject qui est appelée quand le compteur passe à zéro.
Seulement, je suis obligé de faire de même dans le destructeur de la sous classe: virtual ~SmartMusicSequence () { releaseSmartObject(); }
C'est ballot, et de plus je dois tester le compteur !
Tout ça parce que dans le destructeur de SmartObject, je ne peux pas appeler la fonction releaseSmartObject, car le destructeur de la sous classe SmartMusicSequence a déjà été exécuté.
Ca semble insoluble, mais si quelqu'un à une idée pour contourner le problème ça m'intéresse.
Pour illustrer la complexité du C++, voici le code de gestion du RefCounter:
Et avec un objet bidon SObject:
ça donne:
4 objets sont créés et seulement deux refCount (s1 et s2)
On voit bien ici qu'en C++, gérer l'allocation automatique c'est relou !
En ObjC, on a que de l'allocation dynamique, ce qui simplifie bien les choses.
Mais on a encore des trucs tordus comme on l'a vu au dessus.
A mon avis, dans l'avenir ce type de langage va disparaà®tre au profit de langage de type java, corroboré par le fait qu'à terme tous les OS tourneront dans une machine virtuelle.
Ca risque de ne pas plaire à tout le monde