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.
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:
- allouer de la mémoire pour contenir l'objet demandé en utilisant
operator new
. - 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. - 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.
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é.