我目前正在阅读MS Visual C ++ 6.0中的现有代码。我注意到他们将对象转换为结构的代码模式。
有一个CMemory对象。
CMemory a;
MY_STRUCTURE_A* a = (MY_STRUCTURE_A*)(void *)a;
MY_STRUCTURE_B* a = (MY_STRUCTURE_B*)(void *)a;
我检查了自定义内存类,它确实是一个类对象。它确实有一个=运算符定义但我不认为这会允许它被重新解释为一个结构。为什么要这样做呢。如何将对象类型强制转换为不同的对象?
知道为什么要这样做吗?我知道有一个reinterpret_cast,我猜这种转换为无效指向结构指针的技术是类似的。但我不确定它是否相同。这种模式是否可以安全地将类对象转换为结构体?
注意:CMemory只是所用对象的一个arbritary名称。它不是MFC类的一部分。
根据Necrolis的评论添加。 CMemory和它只有3个成员按以下顺序声明(1)char指针,(2)int指定(1)的已分配内存,以及(3)指向CMemory其他实例的上一个和下一个指针。它还有很多成员方法。据我所知,即使我直接将一个类投射到一个结构中。该类将从第一个成员变量开始,该变量是char指针。
class CMemory {
public:
CAMemory();
... Other methods
private:
char *m_pMemory;
int m_memorySize;
... Other field
}
答案 0 :(得分:1)
通过类的名称和转换,CMemory
很可能是通用内存块标记(对于GC,任意哈希表等),并且为了访问内存,其标记需要强制转换。当然这是一个“最好的猜测”,如果没有看到CMemory
的完整代码,则没有任何意义。
这是否安全,完全没有,它不仅仅是UB,而且没有检查(至少在你的例子中)你投射的对象是否是内存布局所代表的对象。此外,由于这是C ++,他们应该避免C强制转换(正如您所指出的那样。双重转换实际上是为了解决编译器错误/警告,这始终是解决它们的最糟糕方式)。