J'ai lu l'article sur les gardes de portée (Generic: Change the Way You Write Exception-Safe Code — Forever) dans DDJ et je comprends leur utilisation commune.gardes de portée créés Dynamiquement
Cependant, l'utilisation commune est d'instancier un garde de pile particulier sur la pile pour une opération particulière, par exemple .:
{
FILE* topSecret = fopen("cia.txt");
ON_BLOCK_EXIT(std::fclose, topSecret);
... use topSecret ...
} // topSecret automagically closed
mais si je veux planifier les opérations de nettoyage dans l'exécution, par exemple quand j'ai une boucle:
{
vector<FILE*> topSecretFiles;
for (int i=0; i<numberOfFiles; ++i)
{
char filename[256];
sprintf(filename, "cia%d.txt", i);
FILE* topSecret = fopen(filename);
topSecretFiles.push_back(topSecret);
ON_BLOCK_EXIT(std::fclose, topSecret); // no good
}
}
De toute évidence, l'exemple ci-dessus ne fonctionnerait pas, étant donné que topSecret
serait fermé en même temps que la pour portée. Je voudrais un motif de protection de champ où je peux juste la file d'attente aussi facilement les opérations de nettoyage que je RESOLUE à être nécessaire lors de l'exécution. Y at-il quelque chose comme ça disponible?
Je ne peux pas pousser des objets de garde scope dans une file d'attente standard, faire l'objet original (celui que je fais pression) serait rejeté dans le processus. Que diriez-vous de pousser des gardes de pile affectés par tas et d'utiliser une file d'attente qui supprime ses membres sur dtor? Est-ce que quelqu'un a une approche plus intelligente?
Oui, vous avez raison RAII est préférable pour une destructor d'une ressource (par exemple une poignée de fichier). Je n'utilise que des gardes de portée pour des choses qui seraient difficiles à représenter en tant que «ressource», par ex. rapport (OperationStart); ON_BLOCK_EXIT (rapport, OperationEnd); faireQuelque chose(); – Ilya
Malheureusement, je n'ai pas encore TR1 dans mon compilateur, donc je ne peux pas utiliser shared_ptr. Cependant, un vecteur/une file d'attente de auto_ptr pourrait bien fonctionner (en supposant que j'allouerais en tas mes gardes de portée et les pousserais dans le vecteur/la file d'attente). Je suis intrigué d'apprendre que certaines classes C++ deviendront "mobiles" (n'était pas au courant de cette terminologie). Est-ce fait avec des recomptages? Peut-être que je devrais rendre les gardes de portée "mobiles" aussi? –
Ilya
Un vecteur/queue de auto_ptr <...> n'est clairement pas une bonne idée, car auto_ptrs ne sont pas copiables! –