2012-02-06 4 views
2

は、私は公共のヘッダにそのような何かを持っていると言う:C++でvoidからキャストされたポインタを削除しても安全ですか?

class MyClass 
{ 
public: 
    MyClass(); 

protected: 
    virtual ~MyClass(); 

private: 
    void *pSomeInternalClass; 
} 

そして、ここでは私の実装です:

MyClass::MyClass() 
{ 
    pSomeInteralClass = (void *) new SomeInternalClass(); 
} 

MyClass::~MyClass() 
{ 
    SomeInternalClass *pTemp = (SomeInternalClass *) pSomeInternalClass; 
    delete pTemp; 
    pSomeInternalClass = NULL; 
} 

ボイドポインタの背後にある考え方は、私がdont'tということです含める必要がありますパブリックヘッダ内の内部クラスの定義。

私の質問は、私は安全な方法でvoidポインタを処理していますか?削除に問題はありますか?

ありがとうございます!

答えて

7

元のタイプにキャストするのは安全です。

しかし、これを行う必要はありません。あなたのパブリックヘッダにあなたの内部の型を前向きに宣言すれば、この厄介なキャストをする必要はありません。

class YourClass { 
    ... 
    private: 
    class Internal; 
    Internal *pInternal; 
}; 
+0

Afaik、元のタイプにキャストバックする必要はありません。メモリ内の対応するブロックを見つけるためにアドレスのみが使用されます。 – msteiger

+1

MyClassと同じレベルでヘッダのクライアントに公開するのではなく、MyClassのprivate:セクションの中でクラスを宣言する方がずっと良い考えです。 –

+2

いいえ、元の型にキャストする必要があります(仮想デストラクタは少し緩和します)。 'A * a = new A(); B * b =(B *)(void *)a; 'A ::〜A'ではなく' B ::〜B'を呼び出すでしょう。@ user198397 – Mat

3

パブリックヘッダーにクラスの定義を含める必要はありません。すなわち

class SomeInternalClass ; 
class MyClass 
{ 
public: 
    MyClass(); 

protected: 
    virtual ~MyClass(); 

private: 
    SomeInternalClass *pSomeInternalClass; 
} 
+0

MyClassと同じレベルでヘッダのクライアントに公開するのではなく、クラスを 'MyClass'の' private: 'セクションの中で宣言する方がずっと良い考えです。 –

関連する問題