2012-01-31 77 views
1

我正在阅读MS Visual C++ 6.0中的现有代码。我注意到一个代码模式,它们将对象投射到一个结构中。MSVC++类强制转换为struct

有一个CMemory对象。

CMemory a; 
MY_STRUCTURE_A* a = (MY_STRUCTURE_A*)(void *)a; 
MY_STRUCTURE_B* a = (MY_STRUCTURE_B*)(void *)a; 

我检查了自定义内存类,它确实是一个类对象。它确实定义了一个=运算符,但我不认为这将允许它被重新解释为结构。为什么这样做。对象类型如何转换为不同的对象?

任何想法为什么这样做?我知道有一个reinterpret_cast,我猜测这种将void指针指向结构指针的技巧是类似的。但我不确定它是否一样。该模式是否安全地将类对象转换为结构体?

注意:CMemory只是使用的对象的名称。它不是MFC类的一部分。

根据Necrolis的评论添加。 (1)char指针,(2)int指定(1)的分配内存,以及(3)指向其他CMemory实例的前一个和下一个指针。它也有很多成员方法。据我所知,即使我直接把一个班级安排到一个结构上。该类将开始应该是第一个成员变量,它是char指针。

class CMemory { 
public: 
    CAMemory(); 
    ... Other methods 
private: 
    char *m_pMemory; 
    int m_memorySize; 
    ... Other field 
} 

回答

1

由类和铸造的名字呢,CMemory极有可能一个通用的内存块标记(一个GC,任意哈希表等)较多,并访问其标记要求铸造的内存。当然,这是一个“最好的猜测”,没有看到CMemory的完整代码就没有任何意义。

这是安全的,完全不是,它不仅仅是UB,而且没有检查(至少在你的例子中)你投射的对象是否是内存布局表示的对象。而且,这是C++,它们应该避免C cast(正如你所指出的那样,double cast实际上是为了解决编译错误/警告,这总是解决它们的最糟糕的方式)。

+0

我根据您的评论向CMemory添加了详细信息。但我想如果CMemory指向第一个成员字段或类头上的指针可能是4个字节的类头。我认为它会指向第一个成员变量,它是内存块。 – Nap 2012-01-31 12:20:22

相关问题