web-dev-qa-db-fra.com

Créer un nouvel objet C++ à une adresse mémoire spécifique?

Est-il possible en C++ de créer un nouvel objet dans un emplacement mémoire spécifique? J'ai un bloc de mémoire partagée dans lequel j'aimerais créer un objet. Est-ce possible?

34
Chris

Vous voulez placement new () . En gros, il appelle le constructeur en utilisant un bloc de mémoire existante au lieu d'allouer une nouvelle mémoire à partir du tas.

Edit: assurez-vous que vous comprenez bien la remarque sur la responsabilité d'appeler explicitement le destructeur pour les objets créés avec placement new() avant de l'utiliser!

60
D.Shawley

Oui. Vous devez utiliser la variante de placement de l'opérateur new (). Par exemple:

void *pData = ....; // memory segment having enough space to store A object
A *pA = new (pData) A;

S'il vous plaît noter que le placement nouveau ne jette pas exception.

11
dimba

si vous souhaitez affecter un grand nombre d'objets à grain fin, la meilleure approche consiste à utiliser le placement nouveau en conjonction avec une sorte de mémoire tampon circulaire. sinon, vous devrez garder une trace des pointeurs en dehors des pointeurs eux-mêmes.

1
geva30

En supposant que vous ayez un pointeur sur l’emplacement de mémoire sur lequel vous voulez placer un objet, je pense que vous pouvez le transformer en un nouveau type, puis placer un objet à l’emplacement de ce pointeur. C'est une solution qui ne nécessite pas new ().

Compte tenu de votre mémoire: 

// you would use the pointer you have to your allocation of memory char* mem_start = new char[1024]; // Now we have 1024 bytes to play with

On peut le lancer dans un type donné:

CustomType* object_ptr = (CustomType*) mem_start;

Enfin, vous pouvez construire un objet ici:

*(object_ptr) = CustomType();

0
AndruAllen

Sous Windows, MapViewOfFileEx et VirtualAllocEx permettent à l'utilisateur de spécifier une adresse virtuelle préférée. Aucune garantie cependant.

0
PatrickvL