【发布时间】: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成员仍然需要在成员初始化列表中进行初始化。这可能是可行的,但我不知道在我请求后如何释放内存。
我也知道上面的代码可能是最糟糕的方法,所以如果可能的话,请告诉我一个更好的方法。
具体来说,我想知道
- 如何在没有默认构造函数的情况下构造对象,以便以后可以修改数据
- 或者,如果上述方法不可行,如何强制对象充满可以稍后更改的垃圾数据
我知道,对于一个确实具有默认构造函数的对象,您只需在分配值之前获取剩余内存,就像
一样int x; // <-- Set to some "random" value from leftover memory
x = 10; // <-- "random" value replaced with 10
【问题讨论】:
标签: c++ templates initialization containers dynamic-memory-allocation