2012-03-21 13 views
1

私のテストアプリケーションがクラッシュするコードをコンパイラが生成するため、私のコードに奇妙な問題があります。 私はVisual C++ 2010コンパイラを使用しています。 コードは次のとおりです。C++、デリゲート、アプリケーションクラッシュ、不明な理由

template < typename TDstType, 
      typename TSrcType > 
TDstType unsafe_cast(TSrcType anySrc) 
{ 
    return (TDstType) anySrc; 
} 

template < typename TDstType, 
      typename TSrcType > 
TDstType brutal_cast(TSrcType anySrc) 
{ 
    return *(TDstType*) &anySrc; 
} 

template < typename TParamType > 
class EventHandler 
{ 

public: 

    template < typename TObjectType > 
    EventHandler(TObjectType& refObject, 
      void (TObjectType::*pfnMethod)(TParamType)); 

    void operator()(TParamType anyParam); 

private: 

    void* m_ptrMethod; 
    void* m_ptrObject; 

}; 

template < typename TParamType > 
template < typename TObjectType > 
inline EventHandler<TParamType>::EventHandler(TObjectType& refObject, void (TObjectType::*pfnMethod)(TParamType)) 
: m_ptrMethod(brutal_cast< void* >(pfnMethod)), 
    m_ptrObject(&refObject) 
{ 
} 

template < typename TParamType > 
inline void EventHandler<TParamType>::operator()(TParamType anyParam) 
{ 
        class Class; 
    (unsafe_cast<  Class *     >(m_ptrObject)->* 
     brutal_cast< void (Class::*)(TParamType) >(m_ptrMethod))(anyParam); 
} 

とテストアプリケーションのコード:無効なメモリロケーションから読み取るしようとしたとして

class SomeClass 
{ 

public: 

    void Method(int intParam) 
    { 
     printf("%d\n", intParam); 
    } 

}; 

int main(int intArgc, char* arrArgv[]) 
{ 
    EventHandler<int> varEventHandler(*new SomeClass(), &SomeClass::Method); 

    varEventHandler(10); 

    return 0; 
} 

コンパイルされたアプリケーションがクラッシュします。 Visual Studioのデバッガですべての変数がチェックされ、無効なアドレスは含まれていませんでした。 誰もが私が失敗したためにこれを解決するのを助けることができたら幸いです。たぶん、コーヒーの過剰摂取が理由です...

+5

正直言って、私はむしろ 'brutal_cast'と' unsafe_cast'を含むプログラムがうまく動作しないと期待したいと思います。 –

+0

'EventHandler :: operator()'のコードは何ですか? – Jason

+0

どこでどのようにクラッシュしますか? – bitmask

答えて

2

これは動作しません。あなたはvoid *にメンバーへのポインタをキャストすることはできません。そうすることで情報が失われ、プログラムがクラッシュすることは間違いありません。

関連する問題