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

问题描述 投票:0回答:1

我正在尝试在HEAP上分配一些对象,因为我正在尝试设计“树”数据结构,该数据结构本质上是作为链表实现的,并带有指向子链表头的指针。我的问题是,在构建树时,我会初始化树的“主体”(树中的“父”节点)。

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

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);
}

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

我也知道上面的代码可能是解决此问题的最糟糕的方法,因此,请尽可能告诉我更好的方法。

特别是,我想知道

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

我知道,对于does具有默认构造函数的对象,您只需在分配值之前就获得剩余的内存,就像这种情况一样

int x;  // <-- Set to some "random" value from leftover memory
x = 10;  // <-- "random" value replaced with 10
c++ templates initialization containers dynamic-memory-allocation
1个回答
1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.