質問編集履歴

2

修正

2021/09/26 01:00

投稿

oio
oio

スコア1

test CHANGED
File without changes
test CHANGED
@@ -154,6 +154,8 @@
154
154
 
155
155
  - Test::Test
156
156
 
157
+ - Test::Testを抜ける
158
+
157
159
  - A::A
158
160
 
159
161
  - GlobalAのコンストラクタを抜ける(ここでGlobalAは初期化されるのでTest::Testで書き換えたの内容は消える)

1

追記

2021/09/26 01:00

投稿

oio
oio

スコア1

test CHANGED
File without changes
test CHANGED
@@ -135,3 +135,117 @@
135
135
 
136
136
 
137
137
  よろしくお願いいたします
138
+
139
+
140
+
141
+
142
+
143
+ ## 追記
144
+
145
+
146
+
147
+ 原因がわかった気がします
148
+
149
+ グローバル変数GlobalAの初期化より前にコンストラクタ```Test::Test```をよびだす場合に問題が発生します
150
+
151
+
152
+
153
+ 以下の順番で呼び出されています
154
+
155
+ - Test::Test
156
+
157
+ - A::A
158
+
159
+ - GlobalAのコンストラクタを抜ける(ここでGlobalAは初期化されるのでTest::Testで書き換えたの内容は消える)
160
+
161
+ - fを呼ぶがTest::Testで書きこんだ内容は消えデフォルト初期化でaには0が入っている
162
+
163
+
164
+
165
+ ---
166
+
167
+
168
+
169
+ **しかし**気になるのがユニークポインタにしたときです
170
+
171
+ ユニークポインタであればしっかりと動作します
172
+
173
+
174
+
175
+ ```cpp
176
+
177
+ //test.cpp
178
+
179
+
180
+
181
+ #include "test.h"
182
+
183
+
184
+
185
+ struct A{
186
+
187
+ int a{};
188
+
189
+ /*
190
+
191
+ いろいろな変数
192
+
193
+ .
194
+
195
+ .
196
+
197
+ .
198
+
199
+ */
200
+
201
+ };
202
+
203
+
204
+
205
+ //グローバル変数
206
+
207
+ std::unique_ptr<A> GlobalA = nullptr;
208
+
209
+
210
+
211
+
212
+
213
+ ////////////////////////////
214
+
215
+
216
+
217
+ Test::Test(){
218
+
219
+ GlobalA = std::make_unique<A>();
220
+
221
+ GlobalA->a = 100;
222
+
223
+ }
224
+
225
+
226
+
227
+ void Test::f(){
228
+
229
+ //この例では100が入っている
230
+
231
+ std::cout << GlobalA->a <<std::endl;
232
+
233
+ }
234
+
235
+
236
+
237
+ ```
238
+
239
+
240
+
241
+ この例の場合は次のような順番です
242
+
243
+ - Test::Test
244
+
245
+ - Test::TestでGlobalAをstd::make_unique<A>()
246
+
247
+ - GlobalAのコンストラクタを抜ける(ここでGlobalAは```std::unique_ptr```の```std::nullptr_t```を引数にとるコンストラクタで初期化されるのでTest::Testで書き換えたの内容は消える**はず**)
248
+
249
+ - fを呼ぶがTest::Testで書きこんだ内容は消えデフォルト初期化でaには0が入っている
250
+
251
+ と思いきや消えていない...