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 ?
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 ?
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' Shape
s dans le tableau et de les utiliser polymorphically vous avez besoin d'un tableau de pointeurs de Forme.
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.
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 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.