nouvel opérateur pour l'allocation de mémoire sur le tas

Je regardais la signature du nouvel opérateur. Qui est:

void* operator new (std::size_t size) throw (std::bad_alloc);

Mais lorsque nous utilisons cet opérateur, nous n'utilisons jamais de distribution. j'.e

 int *arr = new int;

Alors, comment c++ convertit-il un pointeur de type void* en int* dans ce cas. Parce que, même malloc renvoie un void* et nous devons utiliser explicitement un cast.

27
demandé sur templatetypedef 2011-02-09 09:02:09

2 réponses

Il y a une différence très subtile en C++ entre operator new et l'opérateur new. (Lire qu'une fois de plus... la commande est importante!)

La fonction operator new est l'analogue C++ de la fonction C malloc. C'est un allocateur de mémoire brute dont la responsabilité est uniquement de produire un bloc de mémoire sur lequel construire des objets. Il n'invoque aucun constructeur, car ce n'est pas son travail. Habituellement, vous ne verrez pas operator new utilisé directement dans le code C++; cela semble un peu bizarre. Pour exemple:

void* memory = operator new(137); // Allocate at least 137 bytes

L'opérateur new est un mot clé responsable de l'allocation de mémoire pour un objet et de l'appel de son constructeur. C'est ce qui est le plus souvent rencontré dans le code C++. Quand vous écrivez

int* myInt = new int;

Vous utilisez le nouvel opérateur pour allouer un nouvel entier. En interne, l'opérateur new fonctionne à peu près comme ceci:

  1. allouer de la mémoire pour contenir l'objet demandé en utilisant operator new.
  2. appelez le constructeur d'objet, le cas échéant. Si ce lève une exception, libère la mémoire ci-dessus avec operator delete, puis propage l'exception.
  3. renvoie un pointeur vers l'objet nouvellement construit.

Étant donné que l'opérateur new et operator new sont séparés, il est possible d'utiliser le mot clé new pour construire des objets sans allouer de mémoire. Par exemple, le fameux placement new Vous permet de construire un objet à une adresse mémoire arbitraire dans la mémoire fournie par l'utilisateur. Pour exemple:

T* memory = (T*) malloc(sizeof(T)); // Allocate a raw buffer
new (memory) T(); // Construct a new T in the buffer pointed at by 'memory.'

Surcharger l'opérateur new en définissant une fonction operator new personnalisée vous permet d'utiliser new de cette manière; vous spécifiez comment l'allocation se produit, et le compilateur C++ le câblera dans l'opérateur new.

Si vous êtes curieux, le mot clé delete fonctionne de la même manière. Il y a une fonction de désallocation appelée operator delete responsable de l'élimination de la mémoire, et aussi un opérateur delete responsable de l'appel des destructeurs d'objets et de la libération de la mémoire. Cependant, operator new et operator delete peut être utilisé en dehors de ces contextes à la place de C malloc et free, par exemple.

40
répondu templatetypedef 2011-02-09 06:24:45

Vous confondez new expression avec operator new() fonction. Lorsque le premier est compilé, le compilateur génère entre autres un appel à la fonction operator new() et passe une taille suffisante pour contenir le type mentionné dans l'expression new, puis un pointeur de ce type est retourné.

4
répondu sharptooth 2011-02-09 06:06:08