Les pointeurs non initialisés dans le code
Je suis en train d'apprendre le C++, et je suis venu pour savoir que les pointeurs si laissé non initialisée peut pointer vers des endroits aléatoires dans la mémoire et créer des problèmes de mémoire peut être utilisé par un autre programme.
Maintenant, si c'est le cas, nous ne devrions jamais avoir cette ligne dans n'importe quelle partie de notre code:
int* ptr;
Au lieu de cela, nous devrions avoir quelque chose comme
int* ptr = NULL; //Is this going to avoid the problem
S'il vous plaît suggérer parce que j'ai vu de la première ligne(int* ptr;
) dans de nombreux livres, alors je suis ce doute. Si possible donner quelques exemples.
- Vérifier la valeur null avant d'utiliser un pointeur ou d'utiliser des références à s'en sortir.
- Presque tous compilateur avoir un drapeau qui va vous avertir abou cette. L'allumer.
- Si un pointeur n'est pas explicitement défini à NULL, la vérification de la valeur NULL habitude de faire quelque chose.
Vous devez vous connecter pour publier un commentaire.
Ce sera la cause de
ptr
à point àNULL
qui vous pouvez explicitement vérifier en tant que par défaut/valeur non initialisée. Il empêche le problème que vous décrivez, mais imprudente par le programmeur peut accidentellement déréférencement d'un pointeur null sans vérifier, provoquant un comportement indéterminé.Le principal avantage est à votre disposition pour vérifier si la
ptr
a ou n'a pas été initialisé à quoi que ce soit, c'est à dire:Car c'est assez idiomatique, c'est assez dangereux de ne pas initialiser le pointeur de
NULL
. Le pointeur serait initialisé à une valeur non NULLE valeur d'ordures qui n'a pas vraiment de point à quelque chose de réel. Le pire de tous, la case ci-dessus passerait, même causer des problèmes plus graves si il se trouve que l'adresse du pointeur de la mémoire vous pouvez légalement accès. Dans certains environnements Embarqués, vous pourriez être en mesure d'accéder à une partie de la mémoire, de sorte que vous pourriez endommager accidentellement aléatoire parties de la mémoire ou des parties de votre exécution du code.Toujours initialiser vos variables.
Parfois, vous pouvez initialiser à
NULL
, mais la plupart du temps, vous devriez être en mesure d'initialiser le pointeur de la valeur, il est censé tenir. Déclarer des variables aussi tard que possible, et de les initialiser à ce point, pas 15 lignes plus loin dans votre code.La ligne:
est certainement pas garanti pour initialiser le pointeur de la valeur à quelque chose en particulier.
La ligne:
Va initialiser le pointeur sur l'adresse de zéro, ce qui dans la pratique ne tiendrez jamais rien d'utile, et qui sera classiquement être vérifié pour une valeur de pointeur non valide.
Bien sûr, il est toujours possible, comme cela a été dit par Doug T., afin de tenter d'utiliser ce pointeur sans vérification et il crash tout de même.
Explicitement initialiser à NULL a l'avantage de garantir que le déréférencement de pointeur avant de le mettre à quelque chose d'utile crash, qui est en fait une bonne chose, car il empêche le code de "accidentellement" de travail tout en masquant un bug grave.
Il est toujours préférable d'initialiser un pointeur à NULL si pour une raison quelconque vous ne pouvez pas initialiser tandis que la déclaration se produit . Par exemple:
Généralement une fonction peut vérifier la valeur du pointeur par rapport à NULL pour vérifier que le pointeur a été initialisée avant. Si vous n'avez pas défini explicitement, c'est à NULL, et elle montre une valeur aléatoire, alors il pourrait être déréférencé provoque une erreur de segmentation.
Si le pointeur n'est pas utilisé, le compilateur va simplement l'ignorer. Initialisation à la valeur NULL est la chose prudente à faire, à mon humble avis.
Êtes-vous sûr que votre ne pas confondre avec une déclaration de fonction? Il est très commun pour une fonction à être déclarés en tant que
char* faire_quelque_chose(const char* l'un,const char* deux);
Dans ce cas, les pointeurs sont utilisés pour spécifier quel type d'argument que vous souhaitez passer.
C++ suivre à partir de C en ce qu'il n'est pas conçu pour être un coffre-fort; il est conçu pour être efficace. C'est donc pour cette raison que automatique des variables ne sont pas initialisées. C'est à vous de veiller à ce qu'aucun pointeur est utilisé avant qu'il est initialisé (bien que de nombreux compilateur vous avertira si vous n'avez pas initialiser vos variables)
maintenant
Dans le code ci-dessus, deux cas sont possibles:
Il va exécuter si la valeur par défaut dans ptr n'est pas l'adresse de certains utilisent de la mémoire de programme.
De sortie:
Ça va donner d'erreur (segmentaire faute) si l'adresse par défaut dans le ptr est l'adresse de certains utilisent de la mémoire de programme. E. g. si l'adresse de la variable a dans la mémoire est également 0x400730.
En C++, il est généralement préférable d'éviter de plain old pointeurs tout à fait. Standard de la bibliothèque de classes, des pointeurs intelligents (jusqu'à ce que le C++0x seulement dans les différentes bibliothèques comme Boost ou Loki) et les références qui peuvent et doivent être utilisés dans la plupart des endroits à la place.
Si vous ne pouvez pas éviter les pointeurs, il est en effet préférable de les déclarer avec les initialisations, qui dans la plupart des cas ne doit pas être NUL, mais la cible réelle de la valeur, car en C++, vous pouvez mélanger des déclarations et des expressions librement, de sorte que vous pouvez et ne devrait déclarer la variable au point que vous avez des valeur pour elle.
Qui n'est pas le cas C où vous devez utiliser des pointeurs beaucoup et que toutes les variables ont (ou avaient avant C99; je n'en suis pas sûr) être déclaré au début de la portée. Donc, beaucoup de gens ont encore de mauvaises habitudes de C qui ne sont pas appropriés pour le C++.