Oui, mais en C++ on choisi où l'on à besoin de créer ses objets (pile ou tas). On peut souvent utiliser la pile (sans new, donc sans possibilité de fuite mémoire).
Mais de manière générale oui, une classe gérant des ressources qu'elle alloue sur la pile (avec un new donc) utilisera des pointeurs intelligents.
Le coût d'un std::unique_ptr est nul : aucun impact sur les performance par rapport à un pointeur nu.
Un std::shared_ptr par contre à un coût : le comptage de référence, c'est pas gratuit. Après que ce coût soit négligeable ou pas et dépend vraiment du cas d'utilisation.
Personnellement ça ne me dérange pas les new dans un constructeur, même sans pointeur intelligent : si le new échoue et throw (il éxiste une version nothrow d'ailleurs ), le programme ne pourra de toute façon plus continuer par manque de mémoire, donc risque de fuite mémoire ou pas, c'est la merde.
La norme
Les indications de throw ne sont donc pas obligatoires ?
Je trouve d'ailleurs l'approche de C++ plus propre la dessus (depuis C++11) : au lieu d'indiquer quelles exceptions une fonction peut lancer, on indique qu'une fonction ne peut en aucun cas lancer d'exceptions.
Partager