我正在尝试在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
成员仍需要在成员初始化列表中初始化。这可能可行,但是我不知道在请求内存后如何释放它。
我也知道上面的代码可能是解决此问题的最糟糕的方法,因此,请尽可能告诉我更好的方法。
特别是,我想知道
我知道,对于does具有默认构造函数的对象,您只需在分配值之前就获得剩余的内存,就像这种情况一样
int x; // <-- Set to some "random" value from leftover memory
x = 10; // <-- "random" value replaced with 10
如果使用的是C ++ 17或更高版本,则可以使用std::optional
代替存储实际的对象。即使基础类型不是默认可构造的,这也允许默认构造,这比将垃圾数据复制到对象上更安全。 :-)