100 votes

Peut un pointeur à la base de point dans un tableau d’objets dérivés ?

Je suis allé à un entretien d’embauche aujourd'hui et a reçu cette question intéressante.

Outre la fuite de mémoire et le fait il n’y a aucun destructeur virtuel, pourquoi ce code se bloquer ?

151voto

R. Martinho Fernandes Points 96873

Vous ne pouvez pas l'index comme ça. Vous avez alloué un tableau de Rectangles et stocké un pointeur vers le premier en shapes. Lorsque vous effectuez shapes[1] vous êtes un déréférencement (shapes + 1). Ce ne sera pas vous donner un pointeur vers le prochain Rectangle, mais un pointeur vers ce qui allait être le prochain Shape dans une présumée tableau d' Shape. Bien sûr, c'est un comportement indéterminé. Dans votre cas, vous avez de la chance et obtenir une collision.

À l'aide d'un pointeur à l' Rectangle rend la tâche d'indexation correctement.

int main()
{
   Rectangle * shapes = new Rectangle[10];
   for (int i = 0; i < 10; ++i) shapes[i].draw();
}

Si vous voulez avoir différents types d' Shapes dans le tableau et de les utiliser polymorphically vous avez besoin d'un tableau de pointeurs de Forme.

39voto

Patrick Costello Points 1953

Comme l’a dit Martinho Fernandes, l’indexation est faux. Si vous voulez à la place de stocker un tableau de formes, vous devrez le faire à l’aide d’un tableau de la forme *, comme suit :

Notez que vous devez faire une étape supplémentaire de l’initialisation du Rectangle, étant donné que l’initialisation du tableau permet uniquement de configurer les pointeurs et non les objets eux-mêmes.

14voto

Jonathan Sternberg Points 2554

Lors de l’indexation d’un pointeur, le compilateur va ajouter la quantité appropriée selon la taille de ce qui se trouve à l’intérieur du tableau. Donc, dire que sizeof(Shape) = 4 (car il n’a aucune variable de membre). Mais sizeof(Rectangle) = 12 (nombres exacts sont probablement mal).

Donc lorsque vous indexez commençant à dire... 0 x 0 pour le premier élément, puis lorsque vous essayez d’accéder à la 10e élément que vous essayez d’aller à une adresse non valide ou un endroit qui n’est pas le début de l’objet.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X