Maison  >  Article  >  développement back-end  >  C++ apprenant les fonctions new() et malloc()

C++ apprenant les fonctions new() et malloc()

little bottle
little bottleavant
2019-04-30 13:18:223675parcourir

Les amis qui connaissent le C++ doivent savoir que le C++ offre aux programmeurs la possibilité de gérer le matériel, comme la gestion de la mémoire. Un programmeur C++ de haut niveau peut optimiser à l’extrême les performances des programmes C++ et épuiser les ressources matérielles. Et maintenant, je veux parler de new et de malloc() liés à la gestion de la mémoire.

Parlons d'abord de malloc(). Malloc est une fonction héritée du langage C. Elle est utilisée pour allouer un morceau de mémoire. Son résultat de retour est un pointeur vers la mémoire que vous avez. besoin. Le pointeur, son prototype de fonction et ses exemples d'utilisation sont les suivants :

/*
  函数原型
  其中__size是你要分配的大小,其单位是byte
*/
void* malloc(size_t __size);

// 用例
int* pInt = (int*) malloc(sizeof(int));               // 分配了一个int
double* pDoubleArray = (double*) malloc(sizeof(double) * 5);   // 分配了一个double数组,其大小为5

De manière générale, malloc peut toujours vous allouer de la mémoire. Mais il y a aussi des situations où la situation est accablante et où la mémoire ne suffit pas. À ce stade, malloc renverra un pointeur nul (NULL, nullptr). Lorsque vous utilisez malloc, vous feriez mieux de vérifier si le pointeur renvoyé est nul à chaque fois.

Tutoriels associés : Tutoriel vidéo C++

La mémoire a maintenant été allouée. Lorsque le programme atteint un certain point, je ne veux plus de mémoire. À ce stade, nous devons libérer manuellement la mémoire, sinon cela provoquera une fuite de mémoire. Libérez de la mémoire grâce à la fonction free(). Le prototype de la fonction et les exemples d'utilisation sont les suivants :

// 原型
void free(void* __ptr);

// 用例
free(pInt);
free(pDoubleArray);

Ce qui est intéressant, c'est que ce que vous transmettez à la fonction free n'est qu'un pointeur, mais que vous allouiez un élément ou un array , free peut toujours vous aider à libérer cette mémoire (comment free connaît-il la taille du tableau que vous avez alloué ?)

Laissez-moi vous expliquer en détail ce que fait malloc lors de l'allocation de mémoire. Lorsque malloc alloue de la mémoire, il allouera non seulement la taille de mémoire dont vous avez besoin, mais il ajoutera également des informations supplémentaires en tête et en queue de votre mémoire (communément appelées cookie). Par exemple, les informations utilisées pour le DEBUG et la taille de votre mémoire. Cela explique pourquoi il peut libérer votre mémoire, car il connaît la taille de votre mémoire. Il convient de mentionner que ces cookies occuperont de la mémoire. . .

D'accord, malloc a presque été introduit. Une autre chose que je veux dire est que malloc n'est qu'une fonction tierce, pas une fonction du noyau du système d'exploitation. Si vous avez des besoins supplémentaires, vous pouvez concevoir votre propre malloc. Parlons ensuite du nouveau.

New est un manipulateur (ou mot-clé) fourni par c++. Il est également utilisé pour allouer de la mémoire. Ses cas d'utilisation sont les suivants :

int* pInt = new int(3);            // 分配并构造一个int
double* pDoubleArray = new double[5];    // 分配了一个double数组,其大小是5

delete pInt;                   // 删除单元素
delete[] pDoubleArray;             // 删除数组

C'est encore un vieux sujet De manière générale, le programme peut vous allouer de la mémoire, mais que faire si vous êtes à bout de souffle ? À ce moment-là, le programme lancera une exception std::bad_alloc. Notez que c'est l'une des différences entre new et malloc. Mais ce qui est louable, c'est que C++ fournit un mécanisme pour gérer les exceptions bad_alloc. La méthode est la suivante :

void BadAllocateHandler()
{
  std::cout << "啊,内存分配失败了" << std::endl;
  exit(0);
}

std::set_new_handler(BadAllocateHandler);

BadAllocateHandler est une fonction de traitement écrite par le programmeur lui-même lorsque l'allocation échoue. Et set_new_handler est un mécanisme fourni par c++. De manière générale, il n’y a que deux choses à faire lorsque les jetons sont épuisés. Soit laissez le programme se terminer, soit trouvez un moyen d'extraire de la mémoire ailleurs pour continuer l'allocation.

Vous savez déjà que nouveau est un mot-clé. Pour un programme, toutes les actions reviendront aux appels de fonction. Alors que s’est-il passé exactement une fois neuf ? Lorsque vous créez un nouveau, le programme appellera d'abord la fonction ::operator new(). Ensuite, le programme dans ::operator new() appellera malloc(). Oh ! Tout est clair. Il s'avère que l'essence de new est d'appeler la fonction malloc ! ! De la même manière, l’essence de delete est d’appeler la fonction free().

Bien que l'essence de new soit d'appeler malloc, il y a une grande différence entre new et malloc. Autrement dit, une fois que new est sorti de la mémoire, new vous aidera à construire l'objet, tandis que malloc alloue uniquement de la mémoire. L'exemple spécifique est le suivant :

class MyObj {
public:
  public MyObj(int value) : val(value) {}
  int val;
};

MyObj* obj = new MyObj(4);
MyObj* obj1 = (MyObj*) malloc(sizeof(MyObj));

La méthode de new est qu'après que malloc ait alloué la mémoire, le compilateur appellera directement le constructeur de la classe pour construire l'objet dans cette mémoire. Avis! Seul le compilateur peut appeler directement le constructeur d'une classe. Si vous utilisez malloc, vous ne pouvez pas construire d'objets directement dessus.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer