2009-05-11 6 views
2

Pour wxWidgets, pourquoi avez-vous besoin de dire:wxWidgets en utilisant le 'nouveau' mot-clé

MyFrame *frame = new MyFrame 

au lieu de:

MyFrame frame; 

Quelle est la différence entre les deux? Le second est plus agréable à lire et plus facile à utiliser mais tous les exemples utilisent le premier donc je me demande quelle est la raison. Pour clarifier, je sais que la deuxième version ne fonctionne pas, mais je me demande s'il y a une décision de conception spécifique qui oblige à utiliser la première forme au lieu de la seconde. TIA.

Répondre

3

Le premier alloue une nouvelle instance de MyFrame sur le tas et lui renvoie un pointeur. La seconde crée directement une nouvelle instance de MyFrame sur la pile.

La raison pour laquelle vous devez utiliser la première syntaxe est que vous allez ajouter ce cadre (élément d'interface utilisateur) dans un autre élément de l'interface utilisateur, tel qu'une fenêtre. La fenêtre va prendre le pointeur sur un cadre et l'ajouter en tant qu'enfant. Si vous utilisez la deuxième syntaxe, vous devrez passer un pointeur vers votre objet stack (& frame), qui sera compilé, mais dès que votre méthode sera retournée, le destructeur de frames sera appelé car frame irait hors champ. Cela "casserait" la référence à l'intérieur de votre fenêtre.

+0

Merci. Cela a un sens parfait. Et cela signifie-t-il que si je termine le programme sans nettoyer cette mémoire allouée, que je vais créer des fuites de mémoire? Si oui, y a-t-il une façon automagique de le faire. J'ai entendu le terme RAII utilisé, mais vu seulement dans le cas de scoped_ptrs etc. où les choses disparaissent automatiquement. – bugmenot77

+0

Normalement, ce serait vrai. Cependant, à la fin du programme, votre système d'exploitation nettoiera toutes les ressources. La plupart des boîtes à outils graphiques (et je crois que wxWidgets) gèrent la gestion des ressources (c'est-à-dire: supprimer les appels) des éléments de l'interface utilisateur, s'ils ont été parentés par un autre élément de l'interface utilisateur. Ainsi, par exemple, si vous mettez votre "cadre" à l'intérieur d'une fenêtre, la suppression de votre fenêtre supprimera automatiquement votre cadre. C'est une "caractéristique" de la boîte à outils, et pas la langue, cependant. –

+0

Merci pour les réponses ridiculement rapides! :) – bugmenot77

0

Si vous utilisez 'nouveau', vous allouez le cadre sur le tas. Sinon, il est alloué sur la pile et sera supprimé à la fin du cadre de la pile.

Questions connexes