Numéroté certains mémoire-Je ne comprends pas le travail de placement nouvelle et comment libérer la mémoire
buf = new char[sizeof(student_rec)*5];//student_rec is class
Ensuite, créez un tableau de classe « student_rec » en utilisant le placement nouveau.
student_rec *sr1;
sr1 = new(buf)student_rec[5];
Appelez la méthode fun() pour chaque classe.
for(i=0; i<5; i++)
{
sr1[i].fun();
}
Ensuite, appelez le destructeur pour chaque classe.
i = 5;
while(i)
sr1[--i].~student_rec();
Et de supprimer le bloc de mémoire alloué en utilisant supprimer.
delete [] buf;
Alors pourquoi après avoir utilisé sr1 [2] .fun(), il affiche 'bonjour'? Lorsque je supprime la mémoire en utilisant delete [] buf, il n'y a pas de mémoire pour l'objet. Alors pourquoi sr1 [2] fonctionne bien?
Voici mon code-
class student_rec
{
private:
string name;
int roll_no;
float percentage;
public:
student_rec()
{
cout<<"zero argument constructure\n";
}
~student_rec()
{
cout<<"destructure\n";
}
student_rec(char *n, int r, float per)
{
cout<<"three argument constructure\n";
name = n;
roll_no = r;
percentage = per;
}
void show()
{
cout<<"Name= "<<name<<endl;
cout<<"Roll No.= "<<roll_no<<endl;
cout<<"Percentage= "<<percentage<<endl;
}
void fun()
{
cout<<"hello\n";
}
};
int main()
{
char *buf;
buf = new char[sizeof(student_rec)*5];
student_rec *sr1;
sr1 = new(buf)student_rec[5];
int i;
for(i=0; i<5; i++)
{
sr1[i].fun();
}
i = 5;
while(i)
sr1[--i].~student_rec();
delete [] buf;
sr1[2].fun();
return 0;
}
L'accès à la mémoire supprimée est [comportement indéfini] (https://en.wikipedia.org/wiki/Undefined_behavior). Autrement dit, tout peut arriver: vous pouvez obtenir des zéros, des résultats précédents, des éléphants roses ou la culotte de votre copine. Demander pourquoi vous voyez ce que vous voyez est interdit par la norme C++;) – Drop
En savoir plus sur [undefined behavior] (https://en.wikipedia.org/wiki/Undefined_behavior). La suppression d'un objet ne l'efface pas. –
Pour préciser, "ne pas effacer un objet" est également une option pour le résultat du comportement indéfini, car, fondamentalement, est tout autre événement possible dans l'univers. En outre, vous pouvez obtenir des résultats différents en mode débogage/relâchement ou sur un autre système d'exploitation ou un compilateur ou une bibliothèque standard ou à un autre moment de la journée, ou s'il pleut. Ok, je pense que je me suis fait clair;) – Drop