Je rafraîchis mes connaissances en C++ après ne pas l'avoir utilisé en colère pendant un certain nombre d'années. En écrivant du code pour implémenter une structure de données pour la pratique, je voulais m'assurer que mon code était sûr. J'ai donc essayé d'utiliser std::auto_ptr
dans ce que je pense être un moyen approprié. Un peu Simplifier, voici ce que j'ai:Utilisation idiomatique de auto_ptr pour transférer la propriété à un conteneur
class Tree
{
public:
~Tree() { /* delete all Node*s in the tree */ }
void insert(const string& to_insert);
...
private:
struct Node {
...
vector<Node*> m_children;
};
Node* m_root;
};
template<T>
void push_back(vector<T*>& v, auto_ptr<T> x)
{
v.push_back(x.get());
x.release();
}
void Tree::insert(const string& to_insert)
{
Node* n = ...; // find where to insert the new node
...
push_back(n->m_children, auto_ptr<Node>(new Node(to_insert));
...
}
Je suis enroulant la fonction qui placerait le pointeur dans le récipient, vector::push_back
, et se fondant sur l' pour veiller à ce que la Node*
par valeur est l'argument auto_ptr
supprimé si le redimensionnement vector
échoue.
Est-ce une utilisation idiomatique de auto_ptr
pour enregistrer un peu de passe-partout dans mon Tree::insert
? Des améliorations que vous pouvez suggérer? Sinon, je devrais avoir quelque chose comme:
Node* n = ...; // find where to insert the new node
auto_ptr<Node> new_node(new Node(to_insert));
n->m_children.push_back(new_node.get());
new_node.release();
quel type de encombre ce qui aurait été une seule ligne de code si je n'étais pas se soucier de la sécurité d'exception et une fuite de mémoire. (En fait, je me demandais si je pouvais poster mon code entier (environ 300 lignes) et demander aux gens de le critiquer pour une utilisation C++ idiomatique en général, mais je ne suis pas sûr que ce genre de question soit approprié sur stackoverflow .)
En réécrivant vos propres conteneurs, bien sûr, je chercherais normalement une implémentation existante. (Dans ce cas, la vraie structure de données que j'écrivais était une Patricia.) Mais comme mentionné, écrire ceci était plus pour la pratique que quelque chose de pratique. Je suis conscient de l'impossibilité d'utiliser auto_ptrs dans les conteneurs STL. Le point sur l'évaluation de l'argument est bon! Dans mon cas, je devrais être OK puisque l'autre argument est juste une recherche de membre, mais je suppose que ce serait bien d'être cohérent et de toujours nommer mon auto_ptrs pour éviter ce problème potentiel. – heycam