奇妙なプログラムの動作を理解できません - 誰かが説明してくれることを願っています。
ダミー.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*/
header.h:
#include "dummy.h"
extern Dummy dummy;
ダミー.cpp:
#include "dummy.h"
Dummy dummy;
main.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() 関数で呼び出された 2 番目の Get() が -1 を返すのはなぜですか? 割り当てられた値がダミー インスタンスから消え、デコンストラクターが呼び出されなかった理由。どのように -1 になるのですか?
upd: Init() と Get() にデバッグ情報を追加:
新しい出力:
init
get
constructed
2
2
get
-1
deconstructed
upd2: 面白い事実 - 1 つの実行可能ファイルでオブジェクト ファイルを別々にコンパイルおよびリンクすると、状況が変わりました。
g++ -c dummy.cpp
g++ -c main.cpp
g++ dummy.o main.o
./a.out
constructed
init
get
2
2
get
2
deconstructed
しかし、それは罠です!