没有默认构造函数时用垃圾数据初始化 object

Initializing an object with garbage data when there is no default constructor

我正在尝试在 HEAP 上分配一些 objects,因为我正在尝试设计一个 "tree" 数据结构,它本质上是作为一个链表实现的,并添加了指向child 链表的头部。我的问题是我在构建树时初始化树的 "trunk" (这是树中的单个 parent-most 节点)。

我想要树 class 的默认构造函数,因为它是一个容器 class,但是当树的节点中保存的数据没有默认构造函数。正如这个问题的标题所暗示的那样,我最初的想法是通过执行以下操作来简单地用垃圾数据强制节点的数据:

template<class Ty>
Tree<Ty>::Node::Node()
    : parent(nullptr)
    , next(nullptr)
    , child_head(nullptr)
{
    const auto garbage_data_ptr = _malloca(sizeof(Ty));
    if (garbage_data_ptr)
        memcpy(static_cast<void*>(&data), garbage_data_ptr, sizeof(Ty));
    else
        throw std::exception("CANNOT ALLOCATE GARBAGE DATA FOR TRUNK");
    _freea(garbage_data_ptr);
}

当然,问题在于member-initialization列表中的data成员还需要初始化。这可能是可行的,但我不知道如何在我请求后释放内存。

我也知道上面的代码可能是最糟糕的方法,所以如果可能的话,请告诉我更好的方法。

具体来说,我想知道

  1. 如何在没有默认构造函数的情况下构造一个 object 以便以后可以修改数据
  2. 或者,如果以上不可能,如何强制 object 充满垃圾数据,以后可以更改

我知道,在 object 的情况下 确实 具有默认构造函数,您只需在分配值之前获取剩余内存,就像案例

int x;  // <-- Set to some "random" value from leftover memory
x = 10;  // <-- "random" value replaced with 10

如果您使用的是 C++17 或更高版本,您可以使用 std::optional 而不是存储实际对象。这允许默认构造,即使底层类型不可默认构造,这比将垃圾数据复制到对象上更安全。 :-)