Pour l'ensemble des lecteurs, j'aimerais quand même résumer cela car c'est fondamentale.
Une variable globale est connue du programmeur et il "souhaitera" qu'elle soit "instanciée" avant-même le début de la fonction principale (main) et "détruite" après la sortie de cette fonction. Le programmeur ne devra normalement pas ce soucier de cela.
Une variable locale se situe dans un bloque d'instructions délimité par des accolades. La variable est instanciée à l'endroit-même de sa déclaration et détruite après la fin du bloque d'instructions, quoi qu'il en soit ! même si une exception est levée par exemple, ou un goto (à éviter par ailleurs) effectué... C'est ça l'idée, même s'il y a de rares exceptions... Là encore, le programmeur n'a pas à se faire de soucis...
Par contre une variable dynamique est instanciée suite à l'instruction new et détruite avec l'instruction delete. C'est au programmeur de ce soucier qu'à chaque new correspondra un delete opportun. Car cette variable subsistera à tout le reste, que ce soit la fin d'un bloque d'instructions, sortie de fonction, etc. Même la fin du programme, de la fonction principale ne garanti rien. L'adresse allouée de cette variable sera donc précieuse entre le new et le delete, car c'est sur base de cette adresse que le delete pourra se faire.
C'est là qu'intervienne les pointeurs intelligents, encapsuler la "responsabilité" d'une variable dynamique à l'intérieur d'une autre variable, qui par exemple, sera locale. Ainsi, même suite à la levée d'une exception, le pointeur intelligent (selon l'exemple d'une variable locale) sera détruit, et par-là-même un delete effectué sur la variable dynamique.
Quant à la transmission d'un pointeur à une fonction. Cela signifie généralement que, contrairement à une référence (principalement par convention), l'adresse à pu être stockée dans une variable subsistante à la sortie de la fonction. Ce n'est pas une obligation mais il faudra se poser la question... L'autre possibilité est que cette adresse soit utilisée comme littérateur ou comme base d'une série (array[]). On se souciera alors de savoir comment se fait le parcours et sur quelle base elle prendra fin (nombre d'éléments, adresse de fin, etc. ?). L'adresse d'une variable globale ou locale s'obtient avec l'opérateur & alors qu'un pointeur intelligent prévoira généralement une fonction membre (le fameux std::shared_ptr::get par exemple).
"Par convention" car il est possible à l'intérieur d'une fonction de récupérer l'adresse d'un variable argument de type référence et de la stocker. Mais à mon habitude, je ne m'y attendrais pas... C'est pas "intuitif" me semble-t-il...
[^] # Re: peut-être ceci ?
Posté par Space_e_man (site web personnel) . En réponse au message Petit soucis avec les shared_ptr. Évalué à 2.
Pour l'ensemble des lecteurs, j'aimerais quand même résumer cela car c'est fondamentale.
Une variable globale est connue du programmeur et il "souhaitera" qu'elle soit "instanciée" avant-même le début de la fonction principale (main) et "détruite" après la sortie de cette fonction. Le programmeur ne devra normalement pas ce soucier de cela.
Une variable locale se situe dans un bloque d'instructions délimité par des accolades. La variable est instanciée à l'endroit-même de sa déclaration et détruite après la fin du bloque d'instructions, quoi qu'il en soit ! même si une exception est levée par exemple, ou un goto (à éviter par ailleurs) effectué... C'est ça l'idée, même s'il y a de rares exceptions... Là encore, le programmeur n'a pas à se faire de soucis...
Par contre une variable dynamique est instanciée suite à l'instruction new et détruite avec l'instruction delete. C'est au programmeur de ce soucier qu'à chaque new correspondra un delete opportun. Car cette variable subsistera à tout le reste, que ce soit la fin d'un bloque d'instructions, sortie de fonction, etc. Même la fin du programme, de la fonction principale ne garanti rien. L'adresse allouée de cette variable sera donc précieuse entre le new et le delete, car c'est sur base de cette adresse que le delete pourra se faire.
C'est là qu'intervienne les pointeurs intelligents, encapsuler la "responsabilité" d'une variable dynamique à l'intérieur d'une autre variable, qui par exemple, sera locale. Ainsi, même suite à la levée d'une exception, le pointeur intelligent (selon l'exemple d'une variable locale) sera détruit, et par-là-même un delete effectué sur la variable dynamique.
Quant à la transmission d'un pointeur à une fonction. Cela signifie généralement que, contrairement à une référence (principalement par convention), l'adresse à pu être stockée dans une variable subsistante à la sortie de la fonction. Ce n'est pas une obligation mais il faudra se poser la question... L'autre possibilité est que cette adresse soit utilisée comme littérateur ou comme base d'une série (array[]). On se souciera alors de savoir comment se fait le parcours et sur quelle base elle prendra fin (nombre d'éléments, adresse de fin, etc. ?). L'adresse d'une variable globale ou locale s'obtient avec l'opérateur & alors qu'un pointeur intelligent prévoira généralement une fonction membre (le fameux std::shared_ptr::get par exemple).
"Par convention" car il est possible à l'intérieur d'une fonction de récupérer l'adresse d'un variable argument de type référence et de la stocker. Mais à mon habitude, je ne m'y attendrais pas... C'est pas "intuitif" me semble-t-il...