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

标签 c++ templates initialization containers dynamic-memory-allocation

我正在尝试在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成员仍然需要在成员初始化列表中进行初始化。这可能是可行的,但是我不知道在请求内存后如何释放它。

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

具体来说,我想知道
  • 如何在没有默认构造函数的情况下构造对象,以便以后可以修改数据
  • 或者,如果以上操作均不可行,如何强制对象充满垃圾数据,以后可以更改

  • 我知道,对于确实具有默认构造函数的对象,您只需在分配值之前获取剩余的内存即可,就像这样

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

    最佳答案

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

    关于c++ - 没有默认构造函数时,使用垃圾数据初始化对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61966069/

    相关文章:

    c++ - 为什么 istream 对象可以用作 bool 表达式?

    c++ - 用结构和数组切换结构?

    c++ - 在编译时迭代检查函数是否存在

    c++ - 重构许多函数以优雅地接收任何类型的参数(模板<任何>)

    c++ - 如何返回嵌套在其他包中的模板包?

    c++ - 复制构造函数。有用

    c++ - 用于 C++ 的更好的文本 UI 调试器,例如用于 python 的 pudb

    c++ - 有没有办法在每个启动的新进程上从 Windows 获取事件?

    python - __init__,继承和可变参数

    java - 希望它在循环后输出句子,但它不会编译