teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

2

修正

2021/09/26 01:00

投稿

oio
oio

スコア1

title CHANGED
File without changes
body CHANGED
@@ -76,6 +76,7 @@
76
76
 
77
77
  以下の順番で呼び出されています
78
78
  - Test::Test
79
+ - Test::Testを抜ける
79
80
  - A::A
80
81
  - GlobalAのコンストラクタを抜ける(ここでGlobalAは初期化されるのでTest::Testで書き換えたの内容は消える)
81
82
  - fを呼ぶがTest::Testで書きこんだ内容は消えデフォルト初期化でaには0が入っている

1

追記

2021/09/26 01:00

投稿

oio
oio

スコア1

title CHANGED
File without changes
body CHANGED
@@ -66,4 +66,61 @@
66
66
  ## その他
67
67
  何か質問や追記依頼があれば追記欄にお願いします
68
68
 
69
- よろしくお願いいたします
69
+ よろしくお願いいたします
70
+
71
+
72
+ ## 追記
73
+
74
+ 原因がわかった気がします
75
+ グローバル変数GlobalAの初期化より前にコンストラクタ```Test::Test```をよびだす場合に問題が発生します
76
+
77
+ 以下の順番で呼び出されています
78
+ - Test::Test
79
+ - A::A
80
+ - GlobalAのコンストラクタを抜ける(ここでGlobalAは初期化されるのでTest::Testで書き換えたの内容は消える)
81
+ - fを呼ぶがTest::Testで書きこんだ内容は消えデフォルト初期化でaには0が入っている
82
+
83
+ ---
84
+
85
+ **しかし**気になるのがユニークポインタにしたときです
86
+ ユニークポインタであればしっかりと動作します
87
+
88
+ ```cpp
89
+ //test.cpp
90
+
91
+ #include "test.h"
92
+
93
+ struct A{
94
+ int a{};
95
+ /*
96
+ いろいろな変数
97
+ .
98
+ .
99
+ .
100
+ */
101
+ };
102
+
103
+ //グローバル変数
104
+ std::unique_ptr<A> GlobalA = nullptr;
105
+
106
+
107
+ ////////////////////////////
108
+
109
+ Test::Test(){
110
+ GlobalA = std::make_unique<A>();
111
+ GlobalA->a = 100;
112
+ }
113
+
114
+ void Test::f(){
115
+ //この例では100が入っている
116
+ std::cout << GlobalA->a <<std::endl;
117
+ }
118
+
119
+ ```
120
+
121
+ この例の場合は次のような順番です
122
+ - Test::Test
123
+ - Test::TestでGlobalAをstd::make_unique<A>()
124
+ - GlobalAのコンストラクタを抜ける(ここでGlobalAは```std::unique_ptr```の```std::nullptr_t```を引数にとるコンストラクタで初期化されるのでTest::Testで書き換えたの内容は消える**はず**)
125
+ - fを呼ぶがTest::Testで書きこんだ内容は消えデフォルト初期化でaには0が入っている
126
+ と思いきや消えていない...