Possible en double:
C++'s “placement new”Qu'est-ce qu'un constructeur in-situ en C++?
Qu'est-ce qu'un constructeur en place en C++?
par exemple. Type de données * x = new (y) Datatype();
Possible en double:
C++'s “placement new”Qu'est-ce qu'un constructeur in-situ en C++?
Qu'est-ce qu'un constructeur en place en C++?
par exemple. Type de données * x = new (y) Datatype();
C'est ce qu'on appelle le nouvel opérateur de placement. Il vous permet de fournir la mémoire dans laquelle les données seront allouées sans que l'opérateur new
ne l'alloue. Par exemple:
Foo * f = new Foo();
Ce qui précède vous allouera de la mémoire.
void * fm = malloc(sizeof(Foo));
Foo *f = new (fm) Foo();
ci-dessus utilisera la mémoire allouée par l'appel à malloc
. new
n'alloue plus. Vous n'êtes cependant pas limité aux classes. Vous pouvez utiliser un nouvel opérateur de placement pour tout type que vous alloueriez avec un appel à new
.
A « Gotcha » pour le placement nouveau est que vous ne devriez pas libérer la mémoire allouée par un appel au placement nouvel opérateur en utilisant le mot-clé delete
. Vous allez détruire l'objet en appelant le destructeur directement.
f->~Foo();
Oui. Voir aussi [cette réponse] (http: // stackoverflow.com/questions/2697892/quoi-est-retour-type-de-nouveau-en-c/2697929 # 2697929) pour la différence entre une nouvelle expression et l'allocation de mémoire réelle. – sbi
"' new' n'allouera plus. " - pour l'objet en tant que chose de taille fixe - bien sûr mais bien sûr il va allouer de la mémoire dynamique si l'objet le requiert - des chaînes, des framebuffers, des bases de données, etc. –
Je suis rouillé sur celui-ci mais il vous permet d'écrire l'objet dans un bloc de mémoire que vous avez déjà alloué. Il a également besoin d'une instruction de suppression réciproque pour l'effacer de la mémoire.
Si vous utilisez un pool de mémoire, vous devez utiliser le constructeur in-situ pour initialiser votre objet tel qu'il est alloué à partir du pool.
C'est un moyen d'appeler un constructeur sans allouer de mémoire. Votre y
doit être un pointeur ponant sur suffisamment de mémoire pour un nouvel objet Datatype. En outre, n'appelez pas delete
, appelez ~DataType()
.
La réponse courte est que votre code construit un objet dans l'espace pointé par y
. La réponse longue est mieux couverte par le C++ FAQ.
Ceci est plus communément appelé 'placement nouveau' et est discuté assez bien par le C++ FAQ (dans la zone 'Destructeurs'):
Il permet Vous pouvez construire des objets dans la mémoire brute, ce qui peut être utile dans certaines situations spécialisées, par exemple lorsque vous souhaitez allouer un tableau pour un grand nombre d'objets possibles, mais que vous souhaitez construire au besoin car vous n'aurez peut-être besoin de rien n le maximum, ou parce que vous voulez ou devez utiliser un allocateur de mémoire personnalisé.
Ceci est également appelé _placement new_ et vous pourriez avoir de meilleures chances de trouver des informations pour ce nom. – sbi