C ++,是否有可能直接调用一个构造函数,没有新的?

我可以显式调用构造函数,而不使用new ,如果我已经有一个对象的内存?

 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 

有点。 您可以使用placement new来使用已经分配的内存运行构造函数:

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

所以,你仍然使用new关键字,但没有内存分配发生。

我想你正在寻找新的安置。 C ++ FAQ Lite对你如何做这件事有一个很好的总结。 这个条目有几个重要的问题:

  1. 你应该#include <new>来使用放置新语法。
  2. 您的内存缓冲区需要正确alignment您正在创build的对象。
  3. 手动调用析构函数是你的工作。

让我告诉你一些关于如何在build筑和销毁中完成的代码

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

我希望上面的总结更清楚。

从字面上看,不,没有“新”关键字就无法做到。 查看关于如何使用“new”关键字来调用构造函数而不实际分配内存的所有有关放置的解答。

是的,当你有自己的分配缓冲区,你使用新的位置。 Brian Bondy在一个相关的问题上有一个很好的回应:

有什么用途“安置新”?

你可以调用一个析构函数,但是内存不会被回收,你的调用就相当于一个函数调用。 你必须记住,在析构函数下有两件事情:根据你的规范破坏对象,并回收内存。 既然你将会被调用堆栈中分配的对象,调用它两次可能会导致一个未定义的行为。

是的,使用放置新的 – 如上,但你可能会考虑有第二个工厂类来pipe理存储,即使这意味着复制一个对象。 memcpy()对于小对象通常很便宜。

根据评论,这只适用于Microsoft C ++编译器

很简单,没有new

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

这适用于任何类别:

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