2011-02-09 8 views
0

Le code suivant est-il valide?Initialisation du pointeur dans les classes

class Foo() 
{ 
    int* Bar; 

    public: 

    Foo() 
    { 
     *Bar = 123; 
    } 
} 

En d'autres termes, se Bar pointent en fait sur l'espace réel de la mémoire avant une valeur est affectée à cet espace dans le constructeur? Ou dois-je faire quelque chose comme ceci:

class Foo() 
{ 
    int* Bar; 

    public: 

    Foo() 
    { 
     Bar = new int[1]; 
     *Bar = 123; 
    } 

    ~Foo() 
    { 
     delete[] Bar; 
    } 
} 
+0

Essayez-vous d'attribuer manuellement l'adresse mémoire? En tout cas, je ne suis pas un expert, mais je suis à peu près certain que vous ne dites jamais "new int", ou tout autre primitif. – jakev

+0

Fitst on a tort. vous devez le renouveler. –

Répondre

2

Vous devez affecter de la mémoire comme vous l'avez fait dans le second exemple. Si vous essayez d'exécuter le code dans le premier exemple, il échouera probablement avec une erreur de violation d'accès puisque vous essayez d'écrire l'entier 123 dans la partie de la mémoire que la valeur du pointeur non initialisé Bar pointe vers.

+0

C'est fourni à titre d'exemple. – Maxpm

+0

Ok, édité ma réponse pour refléter cela. – Coincoin

2

Si vous ne voulez pas un tableau dynamique, puis

Bar = new int; 
*Bar = 123; 

est assez! Et puis vous avez à faire:

delete Bar; //not delete[] Bar; 

-

Toutefois, si vous voulez un tableau dynamique (à l'aide que vous pouvez stocker plusieurs valeurs), faites ceci:

Bar = new int[5]; 
Bar[0] = 123; 
Bar[3] = 788; 
//etc 

Ensuite, delete[] Bar est le moyen correct pour supprimer la mémoire allouée!

1

Barra pointera-t-elle réellement sur l'espace mémoire réel avant qu'une valeur soit affectée à cet espace dans le constructeur?

N ° Un pointeur est simplement une variable "simple". Il n'allouera aucune mémoire pour vous. De plus, si vous ne l'initialisez pas, cela indiquera un emplacement arbitraire et généralement imprévisible dans la mémoire.

De manière générale, vous devez l'initialiser à NULL (ou 0 selon vos préférences) ou à la mémoire allouée (comme pour Bar = new int).

1

Dans le premier exemple -

int* Bar; 

Pointeurs pointe sur un objet. Le travail du compilateur consiste à affecter de la mémoire (c'est-à-dire 4 octets) pour le pointeur d'entier Bar afin de contenir l'adresse d'une variable entière. Cependant, à l'endroit où il pointe doit être spécifié afin de déréférencer.

C'est plutôt comme si une banque vous donnait un compte. Juste avoir un compte bancaire ne signifie pas que vous pouvez tirer de l'argent à partir d'un guichet automatique. Votre compte devrait avoir de l'argent pour pouvoir dessiner. La transaction échoue si vous n'avez pas d'argent et dans le paradigme de la programmation, le comportement n'est pas défini. Donc, votre premier exemple de comportement est indéfini. Si mon analogie est trop gênante, je suis désolé.

Dans le second exemple -

int* Bar = new int[1] ; // Here [1] is unnecessary as your Bar points to a single integer memory location. 

Ici, Bar est un pointeur vers l'emplacement d'un entier valide obtenu à partir du magasin libre. Ainsi, l'emplacement du pointeur Bar peut avoir des valeurs de vidage. Alors, intialize, avant de déréférencer. c'est à dire.,

*Bar = 10; 
*Bar *= 10; 

En second exemple, puisque vous gérez des ressources, de sorte que son votre responsabilité de retourner les sources au magasin libre.

Questions connexes