Suis-je l'initialisation de mon C++ référence à des variables correctement?

J'ai essayé de Google cette question, et je ne peux pas trouver quelque chose que je considère comme pertinent. Donc, je dois être à la recherche de quelque chose de mal; néanmoins, j'apprécierais quelques conseils...

Foobar &foobar = *new Foobar(someArg, anotherArg);

Est-ce juste moi ou est-ce que semblent malodorante?

Je comprends que le new mot-clé est conçu pour une utilisation avec des pointeurs (comme telle):

Foobar *foobar = new Foobar(someArg, anotherArg);

Mais que faire si vous n'avez pas besoin d'un pointeur sur l'instance, et vous souhaitez utiliser une référence à la place? Ou, est-ce le cas que vous n'avez pas besoin d'initialiser explicitement (comme les variables locales); et si c'est le cas, comment faire si je veux initialiser les paramètres?

Le code suivant ne fonctionne pas (sauf si je suis en train de faire quelque chose de mal):

//the last argument is of type: int
Foobar &foobar(someArg, anotherArg);

... donne l'erreur de compilateur:

initialiseur liste des expressions traitées comme expression composée
invalide de l'initialisation de la non-const de référence de type ‘Foobar&"
à partir d'un temporaire de type "int"

Et aussi cela ne semble pas fonctionner:

Foobar &foobar = Foobar(someArg, anotherArg);

... donne l'erreur de compilateur:

erreur: invalid initialisation de la non-const de référence de type
"Foobar&" à partir d'un temporaire de type "Foobar"

Mise à jour 1:

Bare à l'esprit que je suis de retour cette valeur, donc je ne veux pas utiliser une variable locale, je veux utiliser une valeur sur le tas, pas la pile:

Foobar &helloWorld()
{
    Foobar &foobar = *new Foobar(someArg, anotherArg);
    foobar.HelloWorld();
    return foobar;
}

Devrais-je être en utilisant des pointeurs au lieu de cela, ou est-ce tout à fait valide?

Ça marche... mais comme je le dis dans ma réponse, c'est non conventionnelles, donc pas d'autre programmeur utilisant helloWorld vont s'attendre à ce qu'ils ont à supprimer le retour de Foobar, et il le fait très fuite de mémoire sur le ventre.
Vous êtes mieux de retourner un pointeur. Ou encore mieux, consultez la stl::auto_pointer. De retour de l'un de ceux-ci, et quel que soit le programmeur à l'aide de votre fonction n'est avec le résultat, il sera garanti à supprimer à nouveau sans laisser une fuite.
Correction, je veux dire auto_ptr.
Bon conseil pour les auto_ptr! 🙂 Je vais commencer à l'utiliser qu'au lieu de retourner des références...
) r3n: ce qui est mal. Comment allez-vous jamais savoir quand gratuit Foobar & >:-). Je suis sûr que vous pouvez écrire que si elle ne marche pas, utiliser de nouvelles. Aussi, si vous regardez c++0x, vous trouverez les && de l'opérateur. Dans un an, quand il s'agit de faire Foobar fooVar(someArg, anotherArg); return fooVar; est efficace.

OriginalL'auteur Nick Bolton | 2009-04-15