无法理解奇怪的程序行为 - 希望有人可以解释。
假人.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?
upd:向 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
但这是一个陷阱!