J'essaie d'enregistrer une variable locale à partir d'une fonction en stockant son adresse. Cependant, il semble que le compilateur libère automatiquement la mémoire de cette variable, même après que je stocke son adresse dans une variable de pointeur.
Je suis dans une situation (pas exactement comme le code ci-dessous) où je dois avoir le membre d'une classe Variable Stocker l'adresse d'une variable déclarée dans une fonction. p> idéalement, * p code> devrait être 5, mais cela finit par être un nombre qui N'EST PAS 5, et c'est une grande partie des moments où je répercute le script. Je crois que la mémoire allouée à A code> dans foo code> est libérée automatiquement. Comment puis-je vous assurer que * p code> est 5 malgré tout retard? P> p>
4 Réponses :
que est strong> le point d'utilisation de variables de stockage automatiques, pour disparaître lorsqu'ils sortent de la portée.
Les pointant après qu'ils soient détruits soit un comportement indéfini. UB peut vous rappeler une valeur correcte, une valeur incorrecte ou un crash de votre application, ou autre. P>
Si vous voulez le garder, ne le rendez pas local. Utilisez (et renvoyez) A Toutes les réponses suggérant une variable statique sont mauvaises. Bien que cela fonctionnera temporairement, il est tenu de créer beaucoup d'autres problèmes si vous en faites une habitude. P> unique_ptr code> / Shared_ptr code> (Bien que je ne vois pas pourquoi vous voulez faire cela dans votre code de toute façon). P>
J'ai essayé d'avoir la fonction renvoyer également A code>, mais laissez la variable retournée inutilisée. Cela corrigera-t-il le problème?
Pointeurs intelligents. Ils vont détruire automatiquement lorsqu'il n'est plus nécessaire. Ne faites jamais de nouveau / supprimer à nouveau.
@MichaelchourDakis Bien sûr, la liaison d'un pointeur global à une variable statique est mauvaise. Néanmoins, la question demande explicitement comment persister les données du pointeur après exécution de la fonction. Juste parce que la prémisse d'une question est «mauvaise» ne fait pas de réponses précises à cette question.
Si vous souhaitez que la variable intérieure Je me sens comme ce que tu es Essayer de faire est très de code malodory, mais voici ce que vous avez demandé: p> dans cet exemple, vous êtes garantis que foo code> persiste après l'appel de la fonction, vous devez effectuer une variable code> code> une variable statique. C ++ est une machine à base de pile: cela signifie que la durée de vie d'une variable est limitée à sa portée. Dans votre exemple A code> est limité à la portée de foo code>. Si vous faites votre variable statique, il prolongera la durée de vie de votre variable à la portée de niveau supérieur, mais limitera votre accès à A code> dans votre fonction. A code> sera initialisé sur votre premier appel et ne sera pas réutilisé ou supprimé jusqu'à la fin de votre programme. P> P>
Si je fais a code> statique dans une fonction de classe C ++, sera-t-il une variable globale, une variable de membre, ou ne sera-t-elle pas accessible que dans cette fonction?
@Alexb Vous pouvez le traiter comme une variable globale qui n'est accessible que dans cette fonction.
Et si j'appelle la fonction à nouveau à l'avenir mais que vous magasinez & A code> dans un autre pointeur, cela ruinera mon pointeur d'origine?
@Alexb Ça ne le sera pas. Cela signifie simplement que vous avez plusieurs points où vous pouvez modifier vos données.
Notez que statique code> en dehors d'une fonction signifie quelque chose de très différent de statique code> à l'intérieur d'une fonction a>. Et les deux sont différents de la signification de statique code> à l'intérieur d'une classe < / a>.
Si vous souhaitez accéder à une mémoire accessible après une sortie de fonction, vous devez l'allouer de manière dynamique en utilisant parce que ce pointeur a été attribué avec nouveau p> p> xxx pré> nouveau code>, il va rester jusqu'à ce que vous appelle Supprimer code> dessus: p> int* p;
void foo() {
static int a = 5;
p = a;
}
int main() {
foo();
// stuff...
std::cout << *p << '\n'; // Prints 5, unless you modified *p
}
Et qu'est-ce que est i> viable et plus intelligent à votre avis?
@Alexb ne soyez pas trop intelligent. Vous ne pourrez pas le déboguer. Laissez le compilateur devenir intelligent, puis testez-le avec un profileur. S'il est trouvé vouloir, obtenez un peu plus intelligent avec les pires parties.
Utilisez une variable statique, et cela résoudra votre problème d'étant 5. La mémoire d'autre part ne sera pas enregistrée en raison du fait que c'est une variable locale. p>
Pourquoi pensez-vous que vous voulez faire cela?
Vous ne pouvez pas. Prenant l'adresse d'un local et de la désirer en dehors de la portée où il est défini est UB.
Voir Cette question .
À l'origine, cette question a été étiquetée avec C ( c ) et C ++ ( C ++ ). Ensuite, la balise C ++ a été supprimée, même si la question de la diversité des références est une non-concept dans un programme C. Les réponses, pas de manière déraisonnable, utilisent
Nouveau code> et autres bits de C ++ (unique_ptr code>,partagé_ptr code>, etc.). Il est probablement mieux étiqueté C ++ que c, donc - même si le code exemple est meilleur C code C ++.Qu'est-ce que
unique_ptr code> /partagé_ptr code>?@Alexb
unique_ptr code> /Shared_PTR code> sont des pointeurs de gestion de la mémoire. Si vous connaissez des constructeurs avec destructeurs, ils suppriment automatiquement les données allouées lorsque la mémoire n'est plus utilisée. C'est un gros sujet, alors j'essaierais de regarder à travers des tutoriels pour voir si peut être quelque chose qui pourrait aider.Préférez un livre hautement recommandé sur des tutoriels trouvés par les recherches sur le Web. Internet est jonché de mauvais tutoriels, d'autres que vous deviendrez un programmeur pire de les lire. Jusqu'à ce que vous sachiez assez bien la langue pour raconter de mauvais avis du mal, vous serez à la merci de Charlatans et de blâmer des abrutis. Si vous êtes toujours intéressé par des tutoriels, recherchez les experts de domaine reconnus et utilisez leurs didacticiels ou leurs tutoriels recommandés. Ne recommandez pas de tutoriels à moins que vous n'ayez un bon à l'esprit.
Duplicaillard possible de