Oui, c'est légal. expr.new/10
de C++14:
Une mise en œuvre est permis d'omettre un appel à une remplaçable mondiale
fonction d'allocation (18.6.1.1, 18.6.1.2). Quand il le fait, le stockage
est fourni par la mise en œuvre ou prévues par l'extension de l'
l'allocation d'une nouvelle expression.
expr.delete/7
:
Si la valeur de l'opérande de la suppression de l'expression n'est pas un null
la valeur du pointeur, puis:
- Si l'appel d'allocation pour la nouvelle expression de l'objet à
supprimé n'a pas été omis et l'allocation n'a pas été prolongé (5.3.4),
la suppression de l'expression doit appeler une fonction de libération (3.7.4.2).
La valeur renvoyée par l'appel d'allocation de la nouvelle expression
doit être passé comme premier argument de la fonction de libération.
- Sinon, si l'allocation a été étendu ou par
l'extension de l'allocation d'une nouvelle expression, et la
supprimer expression pour tous les autres pointeur de la valeur produite par une
nouvelle expression, qui avait de stockage fourni par l'extension des
nouvelle expression a été évaluée, la suppression de l'expression doit convoquer une
la fonction de libération. La valeur renvoyée par l'appel d'allocation de
la nouvelle-expression doit être passé comme premier argument
la fonction de libération.
- Dans le cas contraire, la suppression de l'expression n'ira pas en appel d'une libération de la mémoire
fonction (3.7.4.2).
Donc, en résumé, il est permis de remplacer new
et delete
avec quelque chose de mise en œuvre définies, comme l'utilisation de la pile au lieu de tas.
Remarque: Comme Massimiliano Janes commentaires, le compilateur pourrait pas coller exactement à cette transformation, à votre exemple, si do_something
jette: le compilateur doit laisser de côté destructeur de l'appel d' f
dans ce cas (alors que votre transformé échantillon n'appeler le destructeur dans ce cas). Mais autre que cela, il est libre de le mettre f
dans la pile.