c++ constructor placement-new

C++, ¿es posible llamar a un constructor directamente, sin nuevo?



placement-new (8)

Creo que estás buscando una ubicación nueva. El C ++ FAQ Lite tiene un buen resumen de cómo haces esto. Hay algunos inconvenientes importantes de esta entrada:

  1. Se supone que debes #include <new> para usar la nueva sintaxis de ubicación.
  2. Su memoria intermedia debe alinearse correctamente para el objeto que está creando.
  3. Es su trabajo llamar manualmente al destructor.

¿Puedo llamar al constructor explícitamente, sin usar new , si ya tengo una memoria para el objeto?

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


Déjame mostrarte un código sobre cómo se puede hacer, tanto en la construcción como en la destrucción

#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;

Espero que el resumen anterior aclare las cosas.


Literalmente hablando, NO, no puedes hacerlo sin la palabra clave "nueva". Vea todas las respuestas sobre la ubicación nueva de la forma de usar la palabra clave "nueva" para llamar al constructor sin asignar memoria.


Más o menos Puede usar la colocación nueva para ejecutar el constructor utilizando la memoria ya asignada:

#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");

Por lo tanto, todavía está utilizando la palabra clave new , pero no se realiza ninguna asignación de memoria.


Puede llamar a un destructor, pero la memoria no se recuperará, y su llamada será equivalente a una llamada de función. Debes recordar que debajo del destructor hay dos cosas: destruye el objeto según tu especificación y recupera la memoria. Como se llamará a dtor de todos modos para un objeto asignado en la pila, llamarlo dos veces puede dar como resultado un comportamiento indefinido.



Sí, utilizando la colocación nueva, como se indicó anteriormente, pero podría considerar tener una segunda clase de fábrica para administrar el almacenamiento, incluso si eso significa copiar un objeto. memcpy () es generalmente barato para objetos pequeños.


Según los comentarios, esto solo funciona para compiladores de Microsoft C ++

Sencillamente, sin new :

imguistate = (int *)malloc(ImGui::GetInternalStateSize()); memset(imguistate, 0, ImGui::GetInternalStateSize()); ((ImGuiState *)imguistate)->ImGuiState::ImGuiState();

Esto funciona con cualquier clase:

class SomeClass { public: SomeClass() { printf("Called constructor/n"); } }; int main () { SomeClass *someclass = new SomeClass; someclass->SomeClass::SomeClass(); // call constructor again }