Tableau de structures et de new / delete
J'ai une structure comme ceci:
class Items
{
private:
struct item
{
unsigned int a, b, c;
};
item* items[MAX_ITEMS];
}
Dire que je voulais supprimer un élément, comme suit:
items[5] = NULL;
Et j'ai créé une nouvelle rubrique sur ce même emplacement plus tard:
items[5] = new item;
Ai-je toujours besoin d'appeler delete[]
pour nettoyer ça? Ou ce ne sera pas nécessaire étant donné les limites de la matrice de items[]
sont connus avant la compilation?
Est le paramètre le pointeur à NULL valide ou devrais-je appeler en supprimer?
OriginalL'auteur Daniel Sloof | 2009-01-12
Vous devez vous connecter pour publier un commentaire.
Vous devez appeler
delete
avant de le mettre à NULL. (Le réglage de la valeur NULL n'est pas nécessaire, qu'il aide à réduire les bugs si vous avez accidentellement essayer de déréférencer le pointeur après la suppression.)Rappelez-vous que chaque fois que vous utilisez
new
, vous aurez besoin d'utiliserdelete
plus tard sur le même pointeur. N'utilisez jamais l'un sans l'autre.Aussi,
new []
etdelete []
aller ensemble dans la même façon, mais vous ne devez jamais mélangernew []
avecdelete
ounew
avecdelete []
. Dans votre exemple, depuis la création de l'objet avecnew
(plutôt quenew []
qui permettrait de créer un tableau d'objets de), vous devez supprimer l'objet avecdelete
(plutôt quedelete []
).OriginalL'auteur Jeremy Ruten
Que Kluge a souligné, vous feriez fuite de l'objet à l'index 5 comme ça. Mais celui-ci sonne vraiment comme vous ne devriez pas le faire manuellement, mais l'utilisation d'une classe de conteneur à l'intérieur de
Item
. Si vous n'avez pas réellement besoin de stocker cesitem
objets comme des pointeurs, l'utilisationstd::vector<item>
à la place de ce tableau deMAX_ITEMS
pointeurs. Vous pouvez toujours insérer ou effacer les éléments du vecteur dans le milieu ainsi si vous en avez besoin.Dans le cas où vous avez besoin de stocker des objets comme des pointeurs (généralement si struct
item
est en réalité polymorphe, à la différence dans votre exemple), vous pouvez utiliser boost::ptr_vector<item> à partir de Coup de pouce.PtrContainer à la place.Exemple:
OriginalL'auteur Pyry Jahkola
Pour supprimer un élément à utiliser:
supprimer des éléments[5];
après la suppression de l'élément, il est recommandé de définir la supprimé pointeur à NULL, donc vous n'aurez pas une erreur si vous supprimez par erreur.
éléments[5] = NULL
OriginalL'auteur Joao Vilaca
Je sais peu de Visual Basic, mais qui sent comme un langage de programmation Visual Basic, depuis "a = None" (ou Nulle, je ne suis pas sûr) aurait pour effet de supprimer l'objet pointé par un (ou plutôt de décrémentation son compte de référence, pour les objets COM).
Que quelqu'un d'autre l'a noté, vous devez utiliser:
ou:
Après
delete[5]
, la seule utilisation possible de le pointeur stocké dansitems[5]
est l'origine de vos ennuis. Ce qui est pire, c'est que cela pourrait arriver à travailler au début, et de commencer à défaut uniquement lorsque vous allouer quelque chose d'autre sur l'espace déjà utilisé par*items[5]
. Ceux sont les causes qui font de programmation C/C++ "intéressant", c'est à dire vraiment ennuyeux (même pour qui aime C comme moi).L'écriture
delete items[5];
sauve ce qui peut être une inutile d'écrire, mais c'est une optimisation prématurée.OriginalL'auteur Blaisorblade
Juste pour être clair: vous vous référez à l'appel de "
delete[]
". Je pense que tu veux diredelete
.Je mentionne cela parce que le C++ dispose de deux opérateurs distincts,
operator delete
etoperator delete[]
. Ce dernier est utilisé pour supprimer des ensembles d'objets alloués avecoperator new[]
, et ne pas s'appliquent dans ce cas. Vous disposez d'un tableau de des pointeurs vers objets, vous devez avoir initialisé avec des appels répétés à laoperator new
plutôt qu'un seul appel àoperator new[]
.Tout ce que je suis vraiment en train de dire est: votre utilisation de
delete[]
est confuse et ambiguë; changer àdelete
.OriginalL'auteur j_random_hacker
Il y a quelques liés, à des questions ici:
struct
est, de sorte que vous n'avez pas besoin dedelete[]
le tableau. Si vous avez créé un tableau avecnew[]
vous auriez àdelete[]
.OriginalL'auteur
C++ n'est pas mon fort, mais je suis sûr que vous seriez fuite de la mémoire si vous réglez le pointeur de
NULL
.EDIT: La mémoire de la fuite serait la mémoire pointé par le pointeur dans le tableau.
OriginalL'auteur Hank Gay
Éléments de réglage[5] à la valeur NULL n'est pas de supprimer la mémoire associée à l'élément, il suffit simplement de définir le pointeur sur l'élément en question à NULLE, donc les fuites de mémoire.
Vous pouvez supprimer l'élément en appelant le:
Depuis C++ a pas de collecte des ordures automatique, vous devez le supprimer de la mémoire, vous n'avez plus besoin.
OriginalL'auteur Kluge