使用 Sizeof、malloc 和 cast 的 C++ 对象实例化

c++ object instantiation using sizeof, malloc and cast

本文关键字:C++ 对象 实例化 cast Sizeof malloc 使用      更新时间:2023-10-16

在Java中,我可以使用"Class"方法"newInstance"实例化一个对象,对于我的特定系统,我发现它确实非常有用。我现在正试图在C++实现类似的东西。

对我来说,如何实现这一目标并不明显,但经过一番思考......(你明白了吗...嗯?我认为可以通过创建一个 ClassDescription 类来实现,该类具有一个保存类实例的"sizeof"属性和一个方法 newInstance,该方法会恶意分配此内存量并将其作为 void * 返回。然后,调用代码需要适当地强制转换此代码。

C++语言是否恰当地定义了这是否有效?

顺便一提。。我认识到我可以创建一个注册表,为类保存工厂,这是一个备份计划。对于这个问题的答案,我重视关注我所讨论的内容是否有效的具体问题。

此致敬意

*

附加背景 *此要求的原因是允许泛型库实例化库用户知道的类,但不允许库本身。库将有一些元数据用于实现此目的,因此可以告诉类的大小。从用户的角度来看,不必将工厂对象添加到元数据中是"更整洁的"。

这在某些情况下是有效的。要求是类型必须是"纯旧数据类型"(POD((另请参阅此答案(。如果它有任何更复杂的东西(例如虚拟成员函数,具有虚拟成员函数的成员,基类也必须是 POD 等(,那么它将不起作用并且是未定义的行为。

您可以通过执行以下操作来检查类型是否满足这些要求:

#include <type_traits> 
static_assert(std::is_pod<A>::value, "A must be a POD type.");

一般来说,这可能表明你做错了。C++不是Java,可能有更好的方法来解决潜在的实际问题。

malloc 和 cast 方法中缺少的是对象的构造。使用 new 既可以分配内存,也可以构造内存。这包括构建V表、调用构造函数等。类型转换 malloc 分配的内存无效。

请注意,malloc正确大小的内存块只会为您提供原始内存。您需要在此内存块中构造所需类的对象。这可以通过放置 new 来实现。