2009-12-10 11 views
2
#include <cstdlib> 
#include <iostream> 

using namespace std; 

const unsigned long MAX_SIZE = 20; 
typedef int ItemType; 

class Heap { 
private: 
     ItemType array[MAX_SIZE]; 
     int elements; //how many elements are in the heap 
public: 
     Heap() 
     ~Heap() 
     bool IsEmpty() const 
     bool IsFull() const 
     Itemtype Retrieve() 
     void Insert(const Itemtype&) 
}; 

Disons que j'ai ceci comme mon fichier d'en-tête. Dans mon implémentation pour cela, quelle est la meilleure façon de faire Heap() constructeur et ~ Heap() destructeur.comment détruire un tableau

J'ai

Heap::Heap() 
{ 
    elements = 0; 
} 

Heap::~Heap() 
{ 
    array = NULL; 
} 

Je me demande si cela est la bonne façon de détruire et de construire un tableau dans ce cas.

+3

Que voulez-vous dire par destruction? Mettre à zéro? Ou voulez-vous dire deallocate? Si vous voulez dire le dernier, alors vous n'avez pas à le faire puisque ce tableau sera alloué sur la pile et désalloué lorsque le Heap-Dtor est appelé. – Christian

+0

Il PEUT être alloué sur la pile, ou il ne peut pas. Cela dépend entièrement de la façon dont les instances de tas sont créées. –

+0

Vous avez raison, j'aurais dû être plus précis et j'ai dit que "le tableau sera désalloué automatiquement lorsqu'une instance de Heap sort de sa portée/est désallouée" – Christian

Répondre

8

array n'est pas allouée dynamiquement, de sorte que le stockage pour elle disparaît lorsque l'objet n'existe plus dans la portée. En fait, vous ne pouvez pas réaffecter à array; c'est une erreur de le faire.

0

Vous n'avez pas à détruire votre tableau, car il est utilisé par valeur et n'utilise que des valeurs (int).

+0

Le terme "par valeur" n'est-il pas utilisé lors du passage des paramètres? Peut-être que vous voulez dire la bonne chose, mais je trouve votre réponse peu claire. – foraidt

+0

Je veux dire "par valeur" lorsque l'accès n'est pas "par référence", c'est-à-dire un accès direct à la valeur du champ. –

2

Il n'y a rien à faire dans le dtor, vous n'avez donc pas besoin d'en écrire un. La mémoire de l'objet tableau n'est pas allouée dynamiquement. Par conséquent, lorsque l'objet Heap est hors de portée, la mémoire allouée pour array est automatiquement libérée.

+0

Y at-il quelque chose de mal dans la réponse? J'adorerais entendre la raison de la downvote. – Naveen

+4

C'est techniquement incorrect. L'objet tableau est créé dans le bloc mémoire alloué à l'instance de la classe Heap. Ainsi, l'objet tableau ne sera créé sur la pile que lorsque l'instance de tas est allouée sur la pile. Si l'instance est allouée sur le tas, l'objet tableau sera dans ce bloc. –

+0

Peut-être que j'utilise le terme pile un peu lâchement .. ce que je voulais dire, c'est que la mémoire pour l'objet tableau n'est pas allouée dynamiquement et donc aucune gestion de mémoire explicite n'est nécessaire .. Il nettoiera automatiquement quand l'objet d'encapsulation sera libéré. – Naveen

0

Si vous modifiez le typedef en type basé sur un pointeur, vous devez supprimer chaque ItemType du tableau.

Ainsi, vous pouvez parcourir le tableau et les supprimer

for (int i = 0; i < elements; i++) 
    delete array[i] // Supposing you created them with new 
+0

Et si vous modifiez l'implémentation pour allouer dynamiquement le tableau en utilisant "nouveau", alors vous devrez le faire par la suite: delete [] array; – SapphireSun

1

Étant donné que votre tableau est alloué statiquement (c.-à-sans utiliser new), le destructor n'a pas besoin réellement faire quoi que ce soit - dès que le tas créé est hors de portée (ou est supprimé explicitement s'il est créé dynamiquement) le tableau disparaîtra. Uniquement lorsque vous allouez dynamiquement de la mémoire (par exemple avec new ou malloc() dans le cas d'un code C), vous devez supprimer explicitement (ou free()) la mémoire.

+2

"votre tableau est alloué statiquement sur la pile" - c'est techniquement incorrect. L'objet tableau est créé dans le bloc mémoire alloué à l'instance de la classe Heap. Ainsi, l'objet tableau ne sera créé sur la pile que lorsque l'instance de tas est allouée sur la pile. Si l'instance est allouée sur le tas, l'objet tableau sera dans ce bloc. –

+1

Ah, bon point. Cela ne change pas vraiment le sens de la réponse - le tableau sera détruit quand l'objet est détruit (en sortant de la portée si l'objet est alloué statiquement, ou en étant explicitement supprimé/free() ed s'il est alloué dynamiquement), donc il n'y a pas besoin d'un destructeur. –

+0

Un tableau statique aurait la durée de vie du programme. Rappelez-vous simplement que l'allocation statique est différente de l'allocation automatique et dynamique. –

2

Il existe deux types de tableaux en C++: statique et dynamique. La principale différence entre eux réside dans la façon dont la mémoire pour eux est allouée. Les tableaux statiques sont créés et détruits plus ou moins automatiquement par votre compilateur. Les tableaux dynamiques doivent être créés et détruits par le programmeur. Votre objet utilise actuellement un tableau statique, vous n'avez donc pas besoin de vous inquiéter de sa création ou de sa destruction.

Cependant, si vous voulez changer votre tableau à un tableau dynamique, vous pouvez changer votre code comme suit:

typedef int ItemType; 
ItemType *array; // Pointer to location in memory where the array will reside. 

Heap::Heap() 
{ 
    array = new ItemType[MAX_SIZE]; // Assign memory for the array to use. 
    elements = 0; 
} 

Heap::~Heap() 
{ 
    delete[] array; // Clear the memory used by the array. 
} 
+0

créer/construire/allouer des tableaux, pas "affecter". Vous ne pouvez pas affecter de tableaux en C++ – jalf

+0

oh, et le tableau n'est pas statique. C'est un membre de classe non statique. – jalf

+0

Clarification, il n'y a qu'un seul type de tableau en C++. Il y a plus d'un type de stockage. La fonctionnalité du tableau ne dépend pas de l'endroit où il se trouve; seulement sa durée de vie. Un tableau déclaré dans une fonction est actif jusqu'à ce que l'exécution quitte la fonction. Un tableau dynamique est actif jusqu'à ce qu'il soit désalloué ou que le programme se termine. –

1

tableau comme dans votre exemple original est un sous-objet de votre classe Heap. Il est construit automatiquement par Heap constructeurs et détruit automatiquement par Heap destructeur. Vous n'avez pas besoin de faire quoi que ce soit pour le construire et/ou le détruire.