【问题标题】:C++ Allocate and initialize object manually [duplicate]C ++手动分配和初始化对象[重复]
【发布时间】: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


【解决方案1】:

上述方法是否有效?

没有。不在 C++ 中。

为了创建动态对象,您必须使用 new-expression(或调用 new-expression 的函数)。

有什么缺点吗?

缺点是程序的行为是未定义的。好处是您可以通过跳过新位置来减少输入的字符数。

有一个提议 P0593rX 提议将 C 风格的(琐碎)对象的隐式创建引入 C++。

【讨论】:

  • 你能给我一个破坏上述代码的例子吗?
  • @Gavriil 它已经坏了。程序的行为未定义。
猜你喜欢
  • 2010-09-14
  • 2015-12-03
  • 1970-01-01
  • 2013-07-23
  • 1970-01-01
  • 2012-01-17
  • 2020-01-03
  • 2020-07-18
  • 1970-01-01
相关资源
最近更新 更多