gpt4 book ai didi

c++ - 混合共享/静态库时静态成员的多个拷贝

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:55:29 26 4
gpt4 key购买 nike

情况:

我有:

class Platform {

public:
Platform() { count++; cout << getCount();}
static int getCount() { return count; }

private:
static int count;

}

创建为静态库。

考虑做一个动态库扩展

class __declspec(dllimport/dllexport) DerivedPlatform : public Platform {

}

是的,我知道我是从非 dll 接口(interface)类派生的。

每:Are static fields inherited? ,应该只有一个计数实例。

这是棘手的部分,实际上我最终得到了 count 的两个不同拷贝(即使 count 被声明为静态的)。即,在加载 dll 并调用 registerPlatforms() 后,它会增加一个不同的计数对象:

int main() {

Platform::count = 0;
Platform A; // increases count by 1, cout shows 1

loadPlugin(); // loads the shared library DerivedPlatform
DerivedPlatform D; // increases count by 1 again, cout shows 2

cout << Platform::getCount(); // shows 1 !!!!!!

}

我不知道如何解决这个问题,即。如何确保只有一个静态变量持续存在。显然,DLL 有自己的静态变量堆 - 所以会发生这种情况是有道理的。

最佳答案

是的,这就是将静态库链接到可执行文件和 DLL 时发生的情况。在链接时,双方都不了解对方,因此他们都得到了一份拷贝。对于通常不会造成任何伤害的代码本身,但对于静态变量来说,这可能是一个真正的麻烦。

您需要重新设计您的解决方案,以便静态库位于 DLL 中,可以是现有的,也可以是全新的第三个。或者消除所有静态变量。

关于c++ - 混合共享/静态库时静态成员的多个拷贝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13869809/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com