【发布时间】:2015-12-02 18:35:36
【问题描述】:
假设我有一个主 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 中创建并传递给另一个 DLL 的
Testojbect 之一时,您应该更加关注是否会崩溃。您所有的 DLL 都必须使用相同的编译器、相同的选项进行编译,确保使用的堆相同(对于unordered_map)等等。 -
std::unordered_map的使用只是一个例子。看来我提出的问题有点错误。我的问题是std::type_index是否会指向同一个索引。hash_code值将是相同的。 -
我的意思是,除非 DLL 的构建完全相同,否则您甚至不能考虑任何事情。此外,它不一定是
unordered_map- 如果您的Test类最终执行任何 显式或隐式内存管理,那么在DLL 之间使用Test是有问题的,如果相同的话未使用堆。 -
我明白了。我猜这回答了我的问题。