62 votes

C ++, est-il possible d'appeler un constructeur directement, sans nouveau?

Puis-je appeler explicitement le constructeur, sans utiliser new , si j'ai déjà une mémoire pour objet?

 class Object1{
    char *str;
public:
    Object1(char*str1){
        str=strdup(str1);
        puts("ctor");
        puts(str);
    }
    ~Object1(){
        puts("dtor");
        puts(str);
        free(str);
    }
};

Object1 ooo[2] = {
     Object1("I'm the first object"), Object1("I'm the 2nd")
};

do_smth_useful(ooo);
ooo[0].~Object1(); // call destructor
ooo[0].Object1("I'm the 3rd object in place of first"); // ???? - reuse memory
 

87voto

unwind Points 181987

Sorte de. Vous pouvez utiliser placement new pour exécuter le constructeur en utilisant la mémoire déjà allouée:

  #include <new>

 Object1 ooo[2] = {Object1("I'm the first object"), Object1("I'm the 2nd")};
 do_smth_useful(ooo);
 ooo[0].~Object1(); // call destructor

 new (&ooo[0]) Object1("I'm the 3rd object in place of first");
 

Donc, vous utilisez toujours le mot clé new , mais aucune allocation de mémoire n'a lieu.

20voto

Cthutu Points 3851

Laissez-moi vous montrer un code sur la façon dont cela peut être fait, à la fois en construction et en destruction

 #include <new>

// Let's create some memory where we will construct the object.
MyObject* obj = (MyObject*)malloc(sizeof(MyObject));

// Let's construct the object using the placement new
new(obj) MyObject();

// Let's destruct it now
obj->~MyObject();

// Let's release the memory we used before
free(obj);
obj = 0;
 

J'espère que le résumé ci-dessus rend les choses plus claires.

17voto

Michael Kristofik Points 16035

Je pense que vous recherchez un nouveau placement. La FAQ Lite C ++ résume bien la procédure à suivre. Il y a quelques pièges importants de cette entrée:

  1. Vous êtes censé #include <new> utiliser la nouvelle syntaxe de placement.
  2. Votre mémoire tampon doit être correctement alignée pour l'objet que vous créez.
  3. C'est votre travail d'appeler manuellement le destructeur.

6voto

Ben Voigt Points 151460

Littéralement, NON, vous ne pouvez pas le faire sans le "nouveau" mot clé. Consultez toutes les réponses à propos de l'emplacement new pour savoir comment utiliser le mot-clé "new" pour appeler le constructeur sans allouer réellement de mémoire.

2voto

itsmatt Points 18905

Oui, lorsque vous avez votre propre tampon alloué, vous utilisez placement new. Brian Bondy a une bonne réponse ici dans une question connexe:

http://stackoverflow.com/questions/222557/cs-placement-new

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X