Retournant un pointeur d'une variable locale C++
J'ai besoin de créer une fonction qui retourne un pointeur vers un int.
Comme suit:
int * count()
{
int myInt = 5;
int * const p = &myInt;
return p;
}
Depuis un pointeur est tout simplement une adresse, et la variable myInt est détruit lorsque cette fonction est appelée. Comment dois-je déclarer un int à l'intérieur de cette méthode qui permettra de garder une place dans la mémoire dans l'ordre pour moi d'accéder à plus tard via le pointeur retourné? Je sais que je pourrais déclarer l'int globalement à l'extérieur de la fonction, mais je tiens à le déclarer à l'intérieur de la fonction.
Merci d'avance pour toute aide!
Vous ne pouvez pas (comme décrit dans vous la question). Pourquoi ne pas passer un pointeur d'entier dans la fonction (ou, mieux encore, utiliser une référence)?
il peut utiliser
Pour obtenir une réponse significative, vous allez probablement avoir à nous en dire plus sur comment vous avez l'intention d'utiliser la variable. Par exemple, si j'ai appelé la fonction deux fois dans une rangée, faut-il renvoyer l'adresse de la même variable deux fois, ou une unique variable à chaque fois?
il peut utiliser
new int(something)
mais c'est vraiment stupide, donc ...Pour obtenir une réponse significative, vous allez probablement avoir à nous en dire plus sur comment vous avez l'intention d'utiliser la variable. Par exemple, si j'ai appelé la fonction deux fois dans une rangée, faut-il renvoyer l'adresse de la même variable deux fois, ou une unique variable à chaque fois?
OriginalL'auteur user906357 | 2013-09-27
Vous devez vous connecter pour publier un commentaire.
Utilisation de l'opérateur new
Comme l'a souligné dans d'autres réponses, c'est généralement une mauvaise idée. Si vous devez le faire de cette façon, alors peut-être vous pouvez utiliser un pointeur intelligent. Voir cette question pour savoir comment faire cela
Qu'est ce qu'un pointeur intelligent et quand dois-je utiliser?
Ouais, je devrais vraiment laisser quelqu'un qui est un pointeur const réponse d'un spécialiste de cette.
À mon humble avis - La chose qui crée de la mémoire devrait être responsable de la libérer. Cette réponse sauts de modèle.
Comment puis-je faire la même chose avec un tableau? c'est à dire myInt[10]
Cela ne veut pas répondre à la question, vous êtes en train de créer un nouveau type int sur le tas à chaque fois que cela s'appelle. L'OP veut "un int à l'intérieur de cette méthode qui permettra de garder une place dans la mémoire dans l'ordre pour moi d'accéder à plus tard via le pointeur retourné?". I. e. un unique int en mémoire. @JonathanPotter la réponse devrait être la accepté de répondre.
OriginalL'auteur Nathaniel Johnson
Vous pouvez utiliser des pointeurs intelligents.
Par exemple:
Ensuite, vous pouvez accéder à l'entier comme suit:
OriginalL'auteur Ed Heal
Vous pouvez le faire en faisant de la variable
static
:juste parce que c'est vrai, ne signifie pas qu'il est utile, s'il ne comprend pas statique vars cela perturbera lui pendant des heures
C'est techniquement vrai, mais dangereux de dire simplement, sans plus de contexte (comme les risques lorsqu'il est mélangé avec des threads).
Étant donné que l'OP autre option est une variable globale, ce n'est pas plus dangereux ou inquiétant. Il lui donne un mondial de la var avec le privé, la portée, et je suppose puisque c'est ce qu'il a demandé qu'est ce qu'il veut réellement. Je pense que les gens ont tendance à sur-analyser des questions un peu ici de temps en temps.
ce n'est pas que nous sur l'analyser, mais nous pouvons voir les défauts mieux que nous pouvons voir les réponses
OriginalL'auteur Jonathan Potter
C'est une erreur de retourner un pointeur vers une variable locale. x pointe vers une variable allouée sur le tas:
La raison que de retourner un pointeur sur une variable locale est une erreur c'est que cette variable n'existe que tant que la fonction est active (c'est à dire entre il est entré et sorti). Les Variables allouées sur le tas (par exemple, avec l'utilisation de l'opérateur new) existent jusqu'à ce qu'ils sont désalloués (par exemple avec l'opérateur delete).
OriginalL'auteur Anne Staley
Si vous souhaitez retourner un pointeur d'une variable correctement, vous devez faire quelque chose comme.
int * myInt = new int(5);
Ce n'est pas une variable locale BTW, le sens qu'il n'a pas de stockage automatique et que vous avez à
delete
la mémoire vous-mêmeCependant, l'utilisation des pointeurs, comme c'est généralement inutile et proscrite. Il est préférable de créer un int à l'extérieur de la fonction et de la prise de fonction d'une référence.
BTW, je ne sais pas comment vous prévoyez d'utiliser la variable, mais puisque vous suggère également d'utiliser une variable globale, vous souhaiterez peut-être utiliser un
static
var qui @JonathanPotter suggéré en premier. À bien des égards une variable statique est similaire à une variable globale (à la fois statique durées de stockage)int myInt = new int(5);
n'aurez même pas compiler...mon mal de fautes de frappe
OriginalL'auteur aaronman