Je veux mieux comprendre comment implémenter l'idiome RAII avec mes classes, à travers un exemple: Quelle est la méthode recommandée pour s'assurer que les pointeurs sont libres() correctement dans ma classe?RAII - Pointeurs de classe et étendue
J'ai une classe qui devrait exister pour la durée du programme. Dans l'esprit de RAII et parce que j'ai besoin de passer une référence à cette classe à d'autres classes, je la tiens dans un shared_ptr (pas sûr qu'il faut vraiment la contenir dans un shared_ptr, mais pour le fun, ça l'est).
Dans la classe ctor, j'utilise 2 buffers (pointeurs), puis boucle plusieurs fois malloc(), en utilisant le buffer, puis free() 'ing. Le détecteur doit contenir un code de sécurité pour libérer les tampons en cas de problème.
La seule façon dont le dtor peut voir les tampons est si je les déclare comme variables de classe, mais ils ne sont utilisés que dans la classe ctor.
Exemple:
class Input
{
private:
PSOMETYPE buffer1;
public:
Input();
~Input();
}
Input::Input() : buffer1(NULL)
{
for(blahblah)
{
buffer1 = (PSOMETYPE)malloc(sizeof(SOMETYPE));
// Do work w/buffer1
if(buffer1 != NULL) { free(buffer1); buffer1 = NULL }
}
}
Input::~Input()
{
if(buffer1 != NULL) { free(buffer1); buffer1 = NULL }
}
Vu que je n'utilise que le tampon dans le cteur, est-il logique de le déclarer comme une variable de classe privée? Si je le déclare dans le cadre du ctor, le dtor n'aura aucune connaissance de ce que c'est de libérer. Je sais que c'est un exemple trivial, et honnêtement, je pourrais implémenter cela en oubliant facilement d'utiliser un pointeur intelligent pour référencer ma classe et avoir un dteur vide, juste free() comme je le fais dans la boucle . Je n'ai pas de mentor ou de scolarité, et je ne sais pas quand l'idiome RAII devrait être suivi.
Ceci est un mélange étrange d'idées C et C++ ... Y a-t-il une raison pour laquelle vous utilisez malloc au lieu de nouveaux, ou même mieux, STL templated conteneurs? Ceux-ci correspondent beaucoup mieux avec le concept de RAII – tmpearce
@tmpearce: Cela est dû à mon inexpérience et l'utilisation de MSDN comme une ressource d'apprentissage. J'apprécie les références pour les alternatives/améliorations. – Lokked