未调用全局对象构造函数

Global object constructor isn't getting called

本文关键字:构造函数 对象 全局 调用      更新时间:2023-10-16

我的全局对象是在没有调用它们各自的构造函数的情况下创建的:

static int num = 0;
class TestClass
{
public:
    int a;
    float b;
    TestClass(float f)
    {
        a = 55;
        b = f;
        ++num;
    }
};
TestClass test(32);
int main(int argc,char *argv[])
{
    std::cout<<"Int: "<<test.a<<std::endl;
    std::cout<<"Float: "<<test.b<<std::endl;
    std::cout<<"Constructor has been called "<<num<<" times"<<std::endl;
    while(true);
    return 0;
}

输出为:

Int: 0
Float: 0
Constructor has been called 0 times

我以前在不同的项目中使用过这样的构造函数,从未遇到过这样的问题。我尝试过无参数构造函数并将测试变量设置为静态,两者都没有任何不同的效果。有人能告诉我这是怎么回事吗?

我用的是visual studio 2010,以防有什么不同

我不完全确定,但这可能会回答你的问题:http://www.nsnam.org/docs/linker-problems.doc

编辑添加更多信息:

该文档指出了在不同的编译单元中使用全局构造函数时可能出现的问题。例如,如果您在某个动态链接库中全局定义了一个对象,则在访问该库中的方法时可能不会调用其对象构造函数。

用原题中的例子:类TestClass和全局对象test可能在TestLibrary.dll中,而main()函数在某个可执行文件中。根据TestLibrary.dll加载和test对象从可执行文件中访问的方式,它的构造函数可能永远不会被调用,因为库从未被"告知"它刚刚被加载(或者换句话说:全局初始化函数从未被调用)。

如果你编译你的项目,你链接到你的可执行文件,到一个可执行文件,Visual Studio将链接一切正常,但你的全局构造函数不会被调用。