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对你如何做这件事有一个很好的总结。 这个条目有几个重要的问题:
- 你应该
#include <new>
来使用放置新语法。 - 您的内存缓冲区需要正确alignment您正在创build的对象。
- 手动调用析构函数是你的工作。
让我告诉你一些关于如何在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 }