Comment libérer de la mémoire de la dynamique de la structure de la matrice de
Comme quelqu'un qui n'a jamais traité avec la libération de la mémoire et ainsi de suite, j'ai eu la tâche de créer un tableau dynamique de la structure et de créer des fonctions pour ajouter ou supprimer des éléments d'un tableau. Lors de la suppression, j'ai pour libérer de la mémoire qui n'est plus nécessaire.
lors de la suppression de la 2e élément d'un tableau de la taille de 3, je déplace le 3ème élément de la 2ème position et ensuite supprimer le dernier. Lors de la suppression de la dernière, je reçois toujours une erreur... il y a quelqu'un qui peut trouver une solution pour moi?
struct myFriend {
myFriend() {
number=0;
hobbys = new char*[10];
}
int number;
char* name;
char** hobbys;
};
int main() {
myFriend* friendList = new myFriend[10];
myFriend* tempFriend = new myFriend;
tempFriend->number=1;
tempFriend->name = "ABC";
myFriend* tempFriend2 = new myFriend;
tempFriend2->number=2;
tempFriend->name = "XYZ";
myFriend* tempFriend3 = new myFriend;
tempFriend3->number=3;
tempFriend3->name = "123";
friendList[0] = *tempFriend;
friendList[1] = *tempFriend2;
friendList[2] = *tempFriend3;
friendList[1] = friendList[2]; //move 3rd element on 2nd position
delete &(friendList[2]); //and delete 3rd element to free memory
}
- Vous devez utiliser
std::vector
etstd::string
à la place. - Pour la tâche, il est dit d'utiliser des tableaux de char. Mais peut-être que cela va changer. Néanmoins ce n'est pas la solution au vrai problème 🙁 😉
- Vous devez garder une trace de chaque pointeur retourné à partir de
new
etdelete
il exactement une fois. Vous devez également garder une trace de chaque pointeur retourné à partir denew []
et l'utilisationdelete[]
sur le pointeur exactement une fois. Devinez pourquoi nous aimons vecteur et de la chaîne de mieux!
Vous devez vous connecter pour publier un commentaire.
Pourquoi avez-vous créé les variables temporaires? Ils ne sont même pas nécessaires.
Si vous utilisez
std::vector
etstd::string
, le problème auquel vous êtes confronté disparaîtra automatiquement:Pour le faire fonctionner, vous devez redéfinir votre struct comme:
Si vous êtes invité à travailler avec des pointeurs, alors vous devriez faire quelque chose comme ceci:
Et si vous effectuez l'une des opérations suivantes, il serait faux, et invoque un comportement indéfini:
delete [] friends
de ne pas supprimer le nom de membres...Il est impossible de supprimer un sous-ensemble du tableau alloué par
new []
myFriend* friendList = new myFriend[10];
Vous avez un seul ensemble
Vous ne pouvez pas
delete &(friendList[2])
.Vous obtenez à partir de
C++
ensemble du tableau de 10 éléments.Ce tableau commence à partir de
friendList
(ou&(friendList[0])
).operator delete
avec le pointeur à l'adresse retournée parnew
(c'est à direfriendList
) est valideseulement.
Deux choses que j'ai remarqué. (1) Vous êtes apparemment censés "créer des fonctions pour ajouter ou supprimer des éléments" mais vous ne l'avez pas fait, vous avez seulement créé une fonction. (2) Vous faites votre travail plus difficile qu'il doit être en utilisant une structure qui doit aussi gérer la mémoire. Je vous suggère d'utiliser une simplification de la structure.
Votre mission est, en effet, de faire un simple "vecteur" de la classe, donc je vous suggère de le faire. Commencez avec une structure qui est vide. Si le professeur vous demande d'utiliser le
myFriend
struct comme l'écrit, vous pouvez l'ajouter dans après vous terminez la réalisation de votre vecteur de fonctions similaires. Je vais supposer que vous n'êtes pas autorisé à faire une classe encore parce que la plupart des enseignants font l'erreur de laisser jusqu'à la dernière.La taille de la matrice est fixée à 10, de sorte que vous n'avez pas besoin de supprimer des éléments à partir d'elle. Mais vous avez besoin de supprimer le
name
ethobbys
éléments defriendList[1]
(et avant vous l'écraser). Il y a deux problèmes ici:friendList[0]->name = "ABC";
Ici,"ABC"
est un constante zéro chaîne terminée par le caractère quelque part dans la mémoire. Vous n'êtes pas autorisé à supprimer. Donc, vous devez faire une copie.hobby[i]
chaque fois qu'il a été affecté. Mais dans votre code, vous ne pouvez pas dire si il a été affecté. Donc, vous avez à régler chaque élément à 0 dans le constructeur, de sorte que vous aurez plus tard connaître les éléments à supprimer.Le bon endroit pour supprimer ces éléments est dans
myFriends
's destructeur.name
élément devra être supprimé. Mais il y a un piège dans cette, qui j'ai été en soulignant de manière préventive.Il semble que le point de la question est de gérer un tableau dynamique. Le principal problème est qu'il est à l'aide d'un tableau de la liste d'amis. Utiliser un tableau de pointeurs vers des liste d'amis:
Mais tout le monde est juste, il y a majeur questions autour de l'allocation de mémoire pour les hobbys' et 'nom' que vous avez besoin de trier séparément.
Des devoirs à faire, je te suggère d'en apprendre beaucoup plus sur les pointeurs, nouveau/supprimer des opérateurs [nouveau]/delete[] des opérateurs (à ne pas confondre avec nouveau/supprimer des opérateurs) et la création d'objets, copier et/constructeurs/destructeurs. Il est à la base des fonctionnalités C++, et votre tâche est tout au sujet de cette.
À point, quelques directions:
1) Lorsque vous allouer dynamiquement de l'objet comme ce
ou
vous obtenez le pointeur
p
de l'objet créé (new
alloue de la mémoire pour un seul objet de typeMyType
et appelle le constructeur de cet objet).Après votre travail avec cet objet est terminé, vous devez appeler
delete
appelle le destructeur de l'objet, puis libère la mémoire. Si vous n'appelez pasdelete
votre des fuites de mémoire. Si vous l'appelez plus d'une fois, le comportement est indéfini (probablement une corruption de segment qui peuvent conduire à un plantage du programme - parfois à un moment très étrange).2) Lorsque vous allouer dynamiquement de la matrice comme ce
vous obtenez le pointeur
p
de la matrice den
objet créé est situé de manière séquentielle dans la mémoire (new[]
alloue unique bloc de mémoire pourn
des objets de typeMyType
et les appels de constructeurs par défaut pour chaque objet).Vous ne pouvez pas modifier le nombre d'éléments dans ce tableau dynamique. Vous ne pouvez le supprimer.
Après votre travail avec ce tableau est terminé, vous devez appeler
delete[]
appelle le destructeur de chaque objet dans le tableau et puis libère la mémoire. Si vous n'appelez pasdelete[]
votre des fuites de mémoire. Si vous l'appelez plus d'une fois, le comportement est indéfini (probablement plantage du programme). Si vous appelezdelete
au lieu dedelete[]
le comportement est indéfini (probablement destructeur appelé seulement pour le premier objet, puis à tenter de libérer de la mémoire bloc - mais il pourrait être n'importe quoi).3) Lorsque vous affectez la struct/classe alors
operator=
est appelé. Si vous n'avez pasoperator=
explicitement défini pour votre struct/classe alors implicite de l'opérateur= est généré (il effectue l'affectation de tous les non-membre statique de votre structure/classe).