質問編集履歴
2
修正
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
追記
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
|
+
と思いきや消えていない...
|