Existe-t-il un moyen d'utiliser le mot-clé new
à allouer sur la pile (ala alloca
) au lieu de heap (malloc
)? Je sais que je pourrais pirater mon propre mais je préfère ne pas.nouveau sur la pile au lieu de tas (comme alloca vs malloc)
Répondre
Allouer sur la pile, soit Déclarez votre objet comme une variable locale en valeur, ou vous pouvez réellement utiliser alloca pour obtenir un pointeur, puis utilisez le en place nouvel opérateur:
void *p = alloca(sizeof(Whatever));
new (p) Whatever(constructorArguments);
Cependant, si vous utilisez alloca et in-place new pour vous assurer que la mémoire est libérée au retour, vous abandonnez l'appel automatique de destructeur. Si vous essayez simplement de vous assurer que la mémoire est libérée à la sortie de la portée, pensez à utiliser std::auto_ptr<T>
ou un autre type de pointeur intelligent.
Jeffrey Hantin a raison de dire que vous pouvez utiliser placement new pour le créer sur la pile avec alloca. Mais, sérieusement, pourquoi ?! Au lieu de cela, faites simplement:
class C { /* ... */ };
void func() {
C var;
C *ptr = &var;
// do whatever with ptr
}
Vous avez maintenant un pointeur vers un objet alloué sur la pile. Et, il sera correctement détruit quand votre fonction existe.
Vous pouvez faire:
Whatever* aWhatever = new (alloca(sizeof(Whatever))) Whatever;
Vous pourriez utilise une classe RAII pour faire la destruction, je suppose (EDIT: Voir aussi this other answer for more information on potential problems with this approach):
template <class TYPE>
class RAII
{
public:
explicit RAII(TYPE* p) : ptr(p) {}
~RAII() { ptr->~TYPE(); }
TYPE& operator*() const { return *ptr; }
private:
TYPE* ptr;
}
void example()
{
RAII<Whatever> ptr = new (alloca(sizeof(Whatever))) Whatever;
}
Vous pouvez utiliser une macro pour cacher la alloca.
Cordialement DaveF
Soyez prudent lorsque vous utilisez _alloca()
avec GCC
GCC a un bug which makes _alloca()
incompatible with SJLJ exception handling en C++ (DWARF2 est rapporté fonctionne correctement). Lorsqu'une exception est expulsée de la fonction allouant la mémoire, le bogue provoque une corruption de la pile avant que les destructeurs ne puissent s'exécuter. Cela signifie que toute classe RAII travaillant sur le (s) objet (s) alloué (s) doit exécuter dans une autre fonction pour fonctionner correctement. La manière correcte de le faire ressemble à ceci:
- 1. Avez-vous déjà utilisé NSZoneMalloc() au lieu de malloc()?
- 2. Création d'un réseau d'objets sur la pile et tas
- 3. Comment avoir des marqueurs sur un groupe de cartes au lieu de la pile
- 4. Concaténer les chaînes au lieu d'utiliser une pile de TextBlocks
- 5. Une liste d'objets doit-elle être stockée sur le tas ou la pile?
- 6. débordement de pile en raison de l'allocation tas/désallocation
- 7. Taille de tas commise vs réservée.
- 8. Journal des événements écrit comme avertissement au lieu de l'erreur
- 9. Construire vs Nouveau problème
- 10. UILabel au lieu de la broche par défaut sur MKMapView
- 11. Où est attribué la référence de la variable, dans la pile ou dans le tas?
- 12. Utilisez SVN au lieu de CVS sur SourceForge
- 13. Comment est tas et la pile des souvenirs mananged, mis en œuvre, attribué
- 14. Question générale: Java a le tas et la pile locale. Pouvez-vous accéder à n'importe quel objet du tas?
- 15. SoapClient enregistrer la demande au fichier au lieu de l'envoyer
- 16. ValidateUser au lieu de LogonUser?
- 17. Héritage au lieu de typedef
- 18. Liste de répertoires au lieu de l'application
- 19. alloca() d'un tableau de types: comment faire cela?
- 20. sorties php au lieu de -
- 21. Gestion globale de la mémoire en C++ en pile ou en tas?
- 22. Comment la pile, le tas et le cadre correspondent-ils conceptuellement aux constructions C#?
- 23. obtenir la valeur maximale en php (au lieu de mysql)
- 24. Simuler le clic de la souris sur la fenêtre au lieu de l'écran
- 25. Débordement à gauche au lieu de droite
- 26. retours act_as_revisable ObjectRevision au lieu de simplement la révision
- 27. jQuery cloneTo au lieu de appendTo?
- 28. faire toutes les variables locales sur la pile
- 29. ne peut pas utiliser «nouveau» sur le type de référence; utiliser 'gcnew' à la place? dans VS 2005
- 30. Propriété malloc objectif c
Votre exemple est exactement ce que je voulais dire en le déclarant comme une variable locale par valeur. –
note: la classe doit avoir un constructeur vide défini dans cpp, si vous avez déjà un constructeur non-vide défini. – kevinf
cas d'utilisation que j'ai - disons que 'C' a une méthode' virtual' surchargée dans les sous-classes 'C1' et' C2'. Ensuite, je peux vouloir faire 'C * ptr = critères? new (alloca (sizeof (C1))) C1 (...): nouveau (alloca (sizeof (C2))) C2 (...); ' – rampion