2012-01-31 78 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

相關問題