2012-02-15 1 views
0

Est-il possible d'allouer dynamiquement une variable temporaire en C++?
Je veux faire quelque chose comme ça:Est-il possible d'allouer dynamiquement une variable temporaire en C++?

#include <iostream> 
#include <string> 

std::string* foo() 
{ 
    std::string ret("foo"); 
    return new std::string(ret); 
} 

int main() 
{ 
    std::string *str = foo(); 
    std::cout << *str << std::endl;                           
    return 0; 
} 

Ce code fonctionne, mais le problème est que je dois créer une autre chaîne afin de le retourner comme un pointeur. Y at-il un moyen de mettre ma variable temporaire/locale dans mon tas sans recréer un autre objet?
Voici une illustration de la façon dont je le ferais:

std::string* foo() 
{ 
    std::string ret("foo"); 
    return new ret; // This code doesn't work, it is just an illustration 
} 
+5

Quel est le problème avec 'std :: string foo() {return" foo "; } '? La copie est presque garantie d'être élue. –

+0

+1 à James, mais évitez «tout sauf», c'est déroutant pour nous, anglophones non-natifs. –

+0

Mon code est beaucoup plus complexe que cela, la contrainte de pointeur n'est pas évitable. – klefevre

Répondre

3

Eh bien oui, il y a, on parle de pointeurs intelligents:

#include <memory> 
std::unique_ptr<std::string> foo() 
{ 
    return std::unique_ptr<std::string>("foo"); 
} 

// Use like this: 
using namespace std; 
auto s = foo();  // unique_ptr<string> instead of auto if you have an old standard. 
cout << *s << endl; // the content pointed to by 's' will be destroyed automatically 
        // when you stop using it 

Modifier : sans changer le type de retour:

std::string* foo() 
{ 
    auto s = std::unique_ptr<std::string>("foo"); 
    // do a lot of stuff that may throw 

    return s.release(); // decorellate the string object and the smart pointer, return a pointer 
         // to the string 
} 
+1

(Je suppose que vous _want_ mémoire allouée dynamiquement, si vous ne retournez pas alors en valeur comme mentionné par James McNellis) –

+0

C'est une bonne façon, mais est-il possible de le faire sans changer le type de retour? (std :: string *)? Je pensais à dynamic_cast mais je n'arrive pas à le faire fonctionner correctement .. – klefevre

+0

Il y a, laissez-moi mettre à jour la réponse. –

0

Que diriez-vous ceci:

std::string* foo() 
{ 
    std::string * ret = new std::string("foo"); 
    // do stuff with ret 
    return ret; 
} 
+1

bien sûr, ce code fonctionne. Au début, je l'ai fait mais je dois faire quelques trucs avec mon var. Mais j'ai beaucoup d'exception à vérifier et je dois supprimer mon var avant chaque lancer. J'ai donc décidé de créer une variable locale, puis après le test, renvoyer un pointeur. – klefevre

+1

Pour compléter ma réponse, les pointeurs intelligents sont garantis être supprimés même si vous lancez. –

Questions connexes