gpt4 book ai didi

c++ - 在 main() 消失之前初始化的值

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:57:52 27 4
gpt4 key购买 nike

无法理解奇怪的程序行为 - 希望有人能解释一下。

虚拟.h:

#ifndef DUMMY_H
#define DUMMY_H

#include <iostream>

class Dummy
{
int val;

public:
int Init(int new_val)
{
return val = new_val;
}

int Get()
{
return val;
}

Dummy():
val(-1)
{
std::cout << "constructed" << std::endl;
}

~Dummy()
{
std::cout << "deconstructed" << std::endl;
}
};

#endif /*DUMMY_H*/

标题.h:

#include "dummy.h"

extern Dummy dummy;

虚拟.cpp:

#include "dummy.h"

Dummy dummy;

主要.cpp:

#include <iostream>

#include "header.h"

int res1 = dummy.Init(2);
int res2 = dummy.Get();

int main()
{
std::cout << res1 << std::endl;
std::cout << res2 << std::endl;
std::cout << dummy.Get() << std::endl;

return 0;
}

编译:g++ -Wall -Wextra main.cpp dummy.cpp

输出:

constructed
2
2
-1
deconstructed

为什么在 main() 函数中调用的第二个 Get() 返回 -1?为什么分配的值​​从虚拟实例中消失并且没有调用解构函数。怎么变成-1了?

更新:向 Init() 和 Get() 添加了调试信息:

新输出:

init
get
constructed
2
2
get
-1
deconstructed

upd2:有趣的事实 - 在一个可执行文件中单独编译和链接目标文件改变了这种情况:

g++ -c dummy.cpp 
g++ -c main.cpp
g++ dummy.o main.o

./a.out

constructed
init
get
2
2
get
2
deconstructed

但这是一个陷阱!

最佳答案

全局变量在不同翻译单元中的初始化顺序是不确定的。 dummy 或 main.cpp 中的两个全局 int 可以先构造。

在您的例子中,首先初始化的是 res1res2,因此您通过调用尚未构造的对象的成员函数来调用未定义的行为。

要修复它,试试这个:

标题.h:

#include "dummy.h"

Dummy& getDummy();

虚拟.cpp:

#include "dummy.h"

Dummy& getDummy()
{
static Dummy dummy; // gets initialized at first call
// and persists for the duration of the program
return dummy;
}

主要.cpp

int res1 = getDummy().Init(2);
int res2 = getDummy().Get();

如果有助于理解,在GetInit 中也添加一些调试cout 语句。你所经历的也被称为static initialization order fiasco .

关于c++ - 在 main() 消失之前初始化的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18871013/

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