nouveau sur pile au lieu de tas (comme alloca vs malloc)
Est-il un moyen d'utiliser le new
mot-clé à allouer sur la pile (ala alloca
) au lieu de tas (malloc
) ?
Je sais que je peut pirater mon propre mais je préfère ne pas.
source d'informationauteur
Vous devez vous connecter pour publier un commentaire.
À allouer sur la pile, soit déclarer votre objet, comme une variable locale en valeurou vous pouvez réellement utiliser alloca pour obtenir un pointeur, puis l'utilisation de la nouvelle l'opérateur:
Cependant, tout en utilisant des alloca et en place de nouveaux assure que la mémoire est libérée sur le retour, vous donner automatique destructeur de l'appelant. Si vous êtes juste essayer de s'assurer que la mémoire est libérée lors de la sortie de l'application, pensez à utiliser
std::auto_ptr<T>
ou quelque autre type pointeur intelligent.Jeffrey Hantin est tout à fait exact que vous pouvez utiliser le placement de nouvelles d'en créer un sur la pile avec les alloca. Mais, sérieusement, pourquoi?! Au lieu de cela, il suffit de faire:
Vous avez maintenant un pointeur vers un objet alloué sur la pile. Et, il va bien être détruits lors de votre fonction existe.
Que vous pouvez faire:
Vous pourriez utilise un RAII classe pour faire de la destruction, je suppose (EDIT: voir Aussi cette autre réponse pour plus d'informations sur les problèmes potentiels de cette approche):
Vous pouvez utiliser une macro pour masquer l'alloca.
Ce qui concerne
DaveF
Être prudent lors de l'utilisation de
_alloca()
avec GCCGCC a un bug qui fait
_alloca()
incompatible avec SJLJ la gestion des exceptions en C++ (Dwarf2 fonctionne correctement). Lorsqu'une exception est levée de la fonction de l'allocation de la mémoire, le bug provoque une altération de la pile avant de la destructeurs d'arriver à courir. Cela signifie que toute RAII classe de travail sur l'objet alloué(s) a pour exécuter dans une autre fonction pour fonctionner correctement. La façon correcte de le faire, il ressemble à ceci: