Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 什么时候调用构造函数?_C++_Multithreading_Locking - Fatal编程技术网

C++ 什么时候调用构造函数?

C++ 什么时候调用构造函数?,c++,multithreading,locking,C++,Multithreading,Locking,如果我在函数中途定义了一个类的局部变量实例,而没有使用指针和new,那么构造函数是在进入函数时被调用还是在定义它的地方被调用 如果我在文件中全局定义了一个类的另一个实例,那么在第一次加载可执行文件时会调用该构造函数吗?如果多个线程正在访问.dll呢 最后,您的答案在.dll、.so、.exe和linux可执行文件中是否相同 如果我在函数中途定义了一个类的局部变量实例,而没有使用指针和new,那么构造函数是在进入函数还是在定义它的地方被调用的 当它被定义时 如果我在文件中全局定义了一个类的另一个实

如果我在函数中途定义了一个类的局部变量实例,而没有使用指针和new,那么构造函数是在进入函数时被调用还是在定义它的地方被调用

如果我在文件中全局定义了一个类的另一个实例,那么在第一次加载可执行文件时会调用该构造函数吗?如果多个线程正在访问.dll呢

最后,您的答案在.dll、.so、.exe和linux可执行文件中是否相同

如果我在函数中途定义了一个类的局部变量实例,而没有使用指针和new,那么构造函数是在进入函数还是在定义它的地方被调用的

当它被定义时

如果我在文件中全局定义了一个类的另一个实例,那么在第一次加载可执行文件时会调用该构造函数吗

如果多个线程正在访问.dll呢

DLL通常只为整个应用程序加载一次–事实上,DLL也有一个入口点,由应用程序的线程调用,但全局变量初始化在此之前发生,并且只加载一次

如果我在函数中途定义了一个类的局部变量实例,而没有使用指针和new,那么构造函数是在进入函数时被调用还是在定义它的地方被调用

这些变量具有局部范围。它们的构造函数在定义时被调用。对于局部静态,构造函数只被调用一次,因为静态将在多次函数调用和返回后仍然有效。顺序很重要,也是定义的顺序:

void foo() {
    ....
    if(cond) {
        ...
        // called here: first for f, then for b
        static Foo f;
        static Bar b;
    }

    ...
    Foo f; // not static: called here, in every invocation of foo.
}
如果我在文件中全局定义了一个类的另一个实例,那么在第一次加载可执行文件时会调用该构造函数吗

是的,这样的变量被称为具有静态存储持续时间和命名空间范围。它的构造函数在程序启动时被调用。顺序是文件中定义的顺序。也就是说,稍后定义的变量将在稍后调用其ctor。未定义在不同转换单元中定义的变量的顺序(注意静态初始化顺序失败)。但它们都是在程序开始时调用的

如果多个线程正在访问.dll呢


所有的赌注都输光了。该变量只构造一次。之后,当您启动线程并访问它时,变量必须是线程安全的,或者线程在访问变量时必须进行适当的锁定

对于.dll,它取决于编译器和C运行时(CRT)。对于随Visual Studio 2008 SP1发布的MSVC,.dll的CRT将在
dll\u PROCESS\u ATTACH
时间初始化全局对象,并在
dll\u PROCESS\u DETACH
时间销毁它们,假设在
dll\u PROCESS\u ATTACH
过程中没有发生任何可怕的事情,这是学习使用调试器的完美方法,在构造函数中放置断点(定义一些断点)并查看它们何时被命中。实际上,在Windows上,为每个创建的线程调用DLL入口点(以允许创建线程本地存储)。对于其他操作系统的sHowever不太确定,DLL中的全局变量只构造一次:第一次加载DLL时,以及在第一次加载DLL的线程的上下文中。@zdan:对,对不起。让我纠正一下。事实上,我之前写错了一次,并且也被纠正了。很抱歉,我把静态的初始化搞错了。本地静态非POD的构造函数实际上是在控件通过其定义时调用的,而不是在其块被输入时/之前(这仅适用于POD)。当异常进入游戏时,它变得很重要。干杯你确定酒吧的构造器会在这里被调用一次吗?void foo(){static bar instance;}即使在初始构造中有多个线程同时到达此处,也只能使用一个线程。如果有多个线程,则必须确保互斥,以便初始化只发生一次,不会发生任何错误。(我回答的最后一部分的意思是,默认情况下没有线程本地静态:只有一个静态对象存在,线程必须共享该对象)