我用C dll包装C ++。 dll在我的C#项目中调用。
在我的包装函数中,我调用了很多单例,它们的设置如下:
ComponentManager &ComponentManager::_cmpManager()
{
static ComponentManager ONLY_ONE;
return ONLY_ONE;
}
上面的函数是我的ComponentManager类中的静态函数。 这是具体问题:
bool createNewEntity(char *c)
{
if (ComponentManager::_cmpManager().nameAvailable(c))
{
Entity e(c);
Transform t;
ComponentManager::_cmpManager().addComponent(c, t);
SceneNode sc(CMP_MANAGER2.getComponent<Transform>(c));
SCENE_MANAGER.addSceneNode(sc, e.entityName);
return true;
}
return false;
}
基本上它的作用是单例具有带有键类型字符串的哈希映射,该函数检查该键是否已存在。行为总是返回true。当我使用类型为 componentManager 的全局对象而不是单例时,它的行为正确,所以有些东西告诉我单例不断留下范围并自行删除。此外,如果我在应用程序exe而不是dll中使用单例,它的行为正确。所以我有2个问题,
答案 0 :(得分:0)
C ++ static 关键字与C# static 略有不同。 有关说明,请参阅https://msdn.microsoft.com/en-us/library/y5f6w579.aspx。
在第2项中,它说: 2。在函数中声明变量时,static关键字指定变量在对该函数的调用之间保持其状态。
尝试声明你的静态不在方法内但在类范围内(根据上面参考中的第3项)。
3。在类声明中声明数据成员时,static关键字指定该类的所有实例共享该成员的一个副本。必须在文件范围定义静态数据成员。您声明为const static的整数数据成员可以具有初始化程序。
您还需要在文件范围内声明该静态成员。
为什么它不在dll中时才起作用 - 它不是很清楚。可能是链接器的特殊行为。如果在dll中声明了类,那么每次都可能尝试实例化类,并且每次函数中的静态都是新的。但是如果class在exe文件中,那么每次都是同一个类,当你调用方法_cmpManager()时,它总是访问该类的同一个实例。
只是我的两分钱: - )。