2010-11-13 5 views
0

la situation suivante:Délocaliser un tableau de pointeurs vers des objets?

Class** array = new Class*[8]; 
array[1] = new Class(1,2); 

fait juste « delete[ ] array » suffisante ou devrais-je précéder l'ancien avec « delete array[1] ». Je ne suis pas complètement à l'aise avec la gestion de la mémoire.

+0

Est-ce un code valide? Je n'ai jamais vu l'utilisation du mot-clé "Class" de cette manière. – prabhakaran

+0

@prabhakaran: 'Class' n'est pas un mot-clé; 'class' est. Les noms sont sensibles à la casse en C++. –

+0

(bien que techniquement 'class' n'est pas un nom, c'est un mot-clé ... * soupir *) –

Répondre

5

Chaque fois que vous appelez le new[], vous devez appeler le delete[] sur le pointeur pour libérer l'emplacement. Chaque fois que vous appelez new, vous devez appeler delete.

Dans votre cas, vous appelez deux fois le new. array[1] contient un pointeur vers une classe allouée avec new, il doit donc être désalloué avec delete. Et array est un pointeur vers un tableau alloué avec new[], il doit donc être libéré avec delete[].

Bien sûr, vous pourriez vous évite ce mal de tête par une simple déclaration du tableau comme celui-ci:

Class array[8]; 
array[1] = Class(1,2); 

pas d'allocation de mémoire dynamique signifie pas besoin d'appeler delete.

Ou en utilisant std::vector:

std::vector<Class> array(8); 
array[1] = Class(1,2); 
+0

Cela a du sens. Je pensais que puisque seule la référence au tableau était disponible dans la pile, la suppression de cette référence devrait suffire, c'est-à-dire supprimer le tableau []. – Lakshmie

+2

Considérons que le premier 'new' crée un tableau contenant 8 pointeurs. Si le système supprimait automatiquement les pointeurs individuels, comment le ferait-il savoir * lesquels * supprimer? Vous n'avez défini que la deuxième entrée ('array [1]') pour pointer vers une autre allocation. Les 7 entrées restantes dans le tableau ne sont pas initialisées. Comment le runtime savait-il que 7 d'entre eux ne devraient pas avoir supprimé, mais on devrait le faire? – jalf

+0

Merci beaucoup jalf. Je dois juste me rappeler que c'est comme un élément xml. chaque étiquette de début devrait avoir son étiquette de fin. :) – Lakshmie

0

Si vous créez vector d'objets de classe classe et supposons que sizeof(Class) est plus de 4 octets, alors vector va faire des copies et gaspillerez mémoire. Au lieu de cela, envisagez d'utiliser un vecteur de pointeurs vers des objets Class, ce qui créera toujours 4 * 8 = 32 octets de mémoire sans rapport avec le sizeof(Class).

+0

Si vous souhaitez désallouer dans votre scénario, faites ceci: pour (i = 0 à 7) {delete array [i]; –

Questions connexes