【问题标题】:Initializing an object with garbage data when there is no default constructor没有默认构造函数时用垃圾数据初始化对象
【发布时间】:2020-05-23 00:52:29
【问题描述】:

我正在尝试在 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. 或者,如果上述方法不可行,如何强制对象充满可以稍后更改的垃圾数据

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

一样
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】:

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

    【讨论】:

    • 天哪,天才!谢谢你。我应该想到这一点,但我很少使用std::optional
    猜你喜欢
    • 2011-06-12
    • 1970-01-01
    • 2021-12-16
    • 1970-01-01
    • 2021-05-28
    • 2012-01-02
    • 1970-01-01
    • 2012-01-28
    相关资源
    最近更新 更多