比方說,我有一個主要的DLL,其中有一類這樣的:是的std :: type_index安全跨越的DLL
class Test
{
public:
typedef std::unordered_map< std::type_index, int > Map;
template < typename T > void SetValue(int val)
{
SetValue(std::type_index(typeid(T)), val);
}
template < typename T > int GetValue()
{
return GetValue(std::type_index(typeid(T)));
}
protected:
// Defined in .cpp file
void SetValue(const std::type_index & idx, int val)
{
m_Map[idx] = val;
}
// Defined in .cpp file
int GetValue(const std::type_index & idx)
{
Map::const_iterator itr = m_Map.find(idx);
if (itr != m_Map.cend())
{
return itr->second;
}
return 0;
}
private:
Map m_Map;
};
而且我通過幾個DLL文件共享類的一個實例。而在DLL中的一個我這樣設置一些值:
template < typename T > struct Dummy
{
};
void InitFunc(Test * t)
{
t->SetValue< Dummy<int> >(32);
t->SetValue< Dummy<char> >(10);
t->SetValue< Dummy<float> >(27);
}
而在另一個DLL我嘗試使用相同Dummy
類型獲取這些值。我會得到相同的值還是0?
您應該更關心在嘗試使用在一個DLL中創建的'Test'之一併傳遞給另一個DLL時是否發生崩潰。你所有的DLL必須使用相同的編譯器,相同的選項進行編譯,確保使用的堆是相同的(對於'unordered_map')等。 – PaulMcKenzie
使用'std :: unordered_map'只是一個例子。看來我形成了一個錯誤的問題。我的問題是如果'std :: type_index'指向相同的索引。 'hash_code'值將是相同的。 –
我的觀點是你甚至不能考慮任何東西,除非DLL的構建完全一樣。另外,它不一定是'unordered_map' - 如果你的'Test'類最終做了任何*內存管理,如果不使用相同的堆,DLL之間的'Test'的顯式或隱式使用是有問題的。 – PaulMcKenzie