Stockage dynamique


1. nouveau et supprimer

1.1 nouveau

  • Utilisez new pour allouer de la mémoire pendant l'exécution du programme. Le format général d'allocation de mémoire pour les objets de données est le suivant: typename * pointer_name = new typename
  • Nécessité de spécifier le type de données de stockage de la mémoire allouée et le type de données associé à la variable de pointeur
  • La nouvelle mémoire n'a pas de nom, elle ne peut être gérée que par le pointeur qu'elle renvoie
  • La différence entre le bloc mémoire alloué par new et la mémoire allouée par les variables conventionnelles: (1) La mémoire des variables conventionnelles est allouée au moment de la compilation, et sa mémoire est dans la pile ; (2) Utiliser new consiste à allouer de la mémoire lorsque le programme est en cours d’exécution, qui est un tas de mémoire (tas) ou une zone libre (stockage libre) dans.
  • Q: (1) Quelle est la différence entre le tas et l'espace de pile? (2) Pourquoi la mémoire de new et la mémoire de variables conventionnelles sont-elles respectivement allouées à partir du tas et de la pile? (3) Comment new alloue-t-il la mémoire?
  • R: non

1.2 supprimer

  • Utiliser la suppression pour libérer la mémoire: la mémoire allouée à l'aide de new est libérée par suppression. S'il n'y a que nouveau mais aucune suppression, une fuite de mémoire se produit , c'est-à-dire que la mémoire libérée par new ne retourne pas dans le pool de mémoire et ne peut pas être réutilisée par new.
  • Utiliser le format de suppression : supprimer la variable de pointeur , la variable de pointeur pointe vers l'adresse de la nouvelle mémoire, pas l'adresse d'une variable régulière.

1.3 Précautions d'utilisation de new et delete

  • N'utilisez pas delete pour libérer de la mémoire qui n'est pas allouée par new: la mémoire allouée par new doit être libérée par delete, et delete ne peut libérer que la mémoire allouée par new.
  • N'utilisez pas la suppression pour libérer la mémoire qui a été libérée, le résultat de cette opération sera incertain
  • Si vous utilisez new [] pour allouer de la mémoire au tableau, vous devez utiliser delete [] pour libérer
  • Si vous utilisez new pour allouer de la mémoire à une entité, vous devez utiliser delete (sans crochets) pour libérer
  • Il est prudent d'appliquer la suppression à un pointeur nul

1.4 Exemple

1.4.1 Copier le code sur le livre: allocation dynamique des tableaux

void App(int* & pa, int len);
int main()
{
    
    
	int* ary = NULL, * t;
	int i, n;
	cout << "n=";
	cin >> n;
	App(ary, n);
	for (t=ary; t < ary+n; t++)
	{
    
    
		cout << *t << " ";
	}
	cout << endl;
	for (i = 0; i < n; i++)
	{
    
    
		ary[i] = 10 + i;
	}
	for (i = 0; i < n; i++)
	{
    
    
		cout << ary[i] << " ";
	}
	cout << endl;
	delete[]ary;
	ary = NULL;
 }
void App(int * & pa,int len)//这里pa的参数类型需是指针引用参数
{
    
    
	pa = new int[len];
	if (pa==NULL)
	{
    
    
		cout << "allocation faiure\n";
		return;
	}
	for (int i = 0; i < len; i++)
	{
    
    
		pa[i] = 0;
	}
}

une analyse:

  • Les tableaux alloués dynamiquement sont accessibles à l'aide d'indices ou de pointeurs
  • Le format du tableau alloué dynamiquement: type * pointer = nouveau type [longueur du tableau]
  • Libérez le tableau dynamique: pointeur de suppression []
  • Afin d'éviter les fuites de mémoire, attribuez la valeur de ary à t lors de l'utilisation de l'accès au pointeur , sinon la suppression finale ne pointera pas vers le nouveau tableau dynamique
  • Dans la fonction App , pa utilise un paramètre de référence de pointeur. Si le paramètre de référence n'est pas utilisé, ary transmet simplement sa valeur à pa , c'est-à-dire pa = NULL , mais l'adresse du tableau dynamique reçu par pa ne peut pas être transmise à ary Lorsque l' application est appelée, pa Sera libéré par le système (peut être compris comme une variable locale). Le résultat est que la valeur de ary est toujours NULL et que le nouveau tableau dynamique ne peut pas être supprimé car pa a été libéré par le système. Si vous n'utilisez pas de paramètre de référence, la fonction App () doit renvoyer un pointeur vers le tableau dynamique vers ary.

1.4.2 Code du livre de copie: types de base

int main()
{
    
    
	int* p = NULL;
	p = new int(100);
	if (p==NULL)
	{
    
    
		cout << "allocation faiure\n";
	}
	else
	{
    
    
		cout << *p << endl;
		delete p;
		p = NULL;
	}
 }

une analyse:

  • Les types de base utilisent new pour appliquer l'espace: type * nom de la variable de pointeur = nouveau type (valeur initiale)
  • Vous pouvez utiliser des parenthèses pour initialiser la valeur de la mémoire demandée
  • Après la suppression, la variable de pointeur ne disparaît pas. À ce stade, attribuez-lui la valeur NULL pour effacer la valeur d'adresse d'origine, afin de ne pas libérer la mémoire

Je suppose que tu aimes

Origine blog.csdn.net/qq_36439722/article/details/105758683
conseillé
Classement