【发布时间】:2020-01-31 19:25:08
【问题描述】:
struct entity {
int x;
};
.........
void* memory = GetMemoryFromMyCustomAllocator();
entity* Entity = (entity*) memory;
Entity->x = 1;
我想避免新建、删除或放置新。我使用 c++ 是因为我需要 OOP 功能。
上述方法是否有效?我只需要编写一个函数 InitializeEntity 而不是构造函数,与析构函数相同。有什么缺点吗?谢谢。
【问题讨论】:
-
您说您“使用 C++ 是因为您需要 OOP 特性”。那么,您为什么在这里使用“直接 C”技术?这就是对象及其构造函数和析构函数例程的用途。 这也是“容器类”的用途……这样您就不会分配连续的内存块并使用它们来引用它们指点!
-
为什么要避免放置新的?它几乎完全是为您的用例构建的:它基本上所做的只是调用构造函数。然后,您可以在通过自定义释放器释放内存之前使用
Entity->~entity();手动调用您的析构函数。 -
这对 OOP 来说不仅仅是 ctors。在 C 中,继承或多态比较棘手。
-
@nneonneo 如果我没有析构函数怎么办?
-
缺点是代码是Undefined Behavior;指针指向的位置没有
entity对象。 Placement-new 是一种在特定内存位置创建对象的方法。
标签: c++ memory-management allocator