我正在尝试在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/