首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用mingw在每个新的库或可执行文件中重新初始化本地静态对象

使用mingw在每个新的库或可执行文件中重新初始化本地静态对象
EN

Stack Overflow用户
提问于 2013-06-10 15:46:28
回答 1查看 155关注 0票数 3

我已经构建了一个类工厂,它使用map的本地静态对象来保存它可以创建的所有类的名称:

代码语言:javascript
复制
typedef std::map<std::string, ClassFactory*> typeMap;

static typeMap& getMap() {
    static typeMap map;
    return map;
}

类必须使用以下代码注册到映射:

代码语言:javascript
复制
DerivedRegistering(std::string const& s) {
    std::cout << "Inserting " << s << std::endl;
    std::cout << "Map size " << getMap().size() << std::endl;
    getMap().insert(std::make_pair(s, this));
}

如果我想创建一个新实例,我会调用类的静态createInstance函数:

代码语言:javascript
复制
static Object* createInstance(std::string const& s) {
    std::cout << "Current map size " << getMap().size() << std::endl;
    typeMap::iterator it = getMap().find(s);
    if(it == getMap().end()) // not registered
        return 0;
    return it->second->create();
}

假设我在库A的头文件中创建了这个类工厂,并且我将库A动态链接到一个项目中,该项目链接另一个动态库B,并最终创建一个可执行文件。

现在在linux下的gcc我没有遇到任何问题,但是当我在Windows上使用mingw做同样的事情时,我得到了问题。

对gcc的输出:

代码语言:javascript
复制
Registering classes of library B:
Inserting BA
Map size 0
Inserting BB
Map size 1
Inserting BC
Map size 2
Inserting BD
Map size 3
Inserting BE
Map size 4

Registering classes of library A:
Inserting AA
Map size 5
Inserting AB
Map size 6
Inserting AC
Map size 7
Inserting AD
Map size 8
Inserting AE
Map size 9
Inserting AF
Map size 10
Inserting AG
Map size 11

calling create instance in executable:
Current map size 12

然而,在mingw中,我得到了如下输出:

代码语言:javascript
复制
Registering classes of library B:
Inserting BA
Map size 0
Inserting BB
Map size 1
Inserting BC
Map size 2
Inserting BD
Map size 3
Inserting BE
Map size 4

Registering classes of library A:
Inserting AA
Map size 0
Inserting AB
Map size 1
Inserting AC
Map size 2
Inserting AD
Map size 3
Inserting AE
Map size 4
Inserting AF
Map size 5
Inserting AG
Map size 6

calling create instance in executable:
Current map size 0

因此,在我看来,mingw似乎为每个库和可执行文件创建了一个新的静态本地映射,而gcc则为所有这些库和可执行文件使用相同的内存。

正如您可能猜到的那样,GCC行为就是所需的行为。我可以在mingw中强制执行此操作吗?

EN

Stack Overflow用户

回答已采纳

发布于 2013-06-10 17:54:49

您的函数是静态的,并且包含在多个位置。这意味着您可以创建截然不同的主体和对象。

在.h中创建外部函数,并在.cpp文件中添加一个正文,这样就有了一个单例。

或者,您可以将其设置为内联,而不是静态,以获得相同的效果。

票数 4
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17019083

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档