回答編集履歴

3

勘違い

2021/03/15 11:05

投稿

BeatStar
BeatStar

スコア4962

test CHANGED
@@ -2,156 +2,4 @@
2
2
 
3
3
 
4
4
 
5
- 多分違います。
6
-
7
-
8
-
9
- コードだけを見ても意味ないです。
10
-
11
-
12
-
13
- スタックガ―とかヒープガ―とかは置いといてください。
14
-
15
-
16
-
17
- **こういう場合は『プログラム目線』で考えてください。**
18
-
19
-
20
-
21
-
22
-
23
- C/C++の場合はmain関数、C#やJavaの場合はmainメソッドから開始します。
24
-
25
- Pythonとかは……まあ、置いといて。
26
-
27
-
28
-
29
- で、今回はC++なので main関数から始まります。
30
-
31
-
32
-
33
- ```C++
34
-
35
- int main(){
36
-
37
- Cat cat;
38
-
39
- cat.dog_wan();
40
-
41
- return 0;
42
-
43
- }
44
-
45
- ```
46
-
47
-
48
-
49
- なので、main関数に潜ります。
50
-
51
-
52
-
53
- すると、
54
-
55
-
56
-
57
- ```ここに言語を入力
58
-
59
- 1. Catクラスでcatオブジェクトが生成される
60
-
61
- 2. catのdog_wan() が呼び出される
62
-
63
- 3. 終了
64
-
65
- ```
66
-
67
-
68
-
69
- となっています。
70
-
71
-
72
-
73
- そして、(2)のときに Cat::dog_wan() が呼び出されるので
74
-
75
-
76
-
77
- ```ここに言語を入力
78
-
79
- class Cat{
80
-
81
- public:
82
-
83
- void dog_wan(){
84
-
85
- dog.wan();
86
-
87
- }
88
-
89
- private:
90
-
91
- Dog dog;
92
-
93
- };
94
-
95
- ```
96
-
97
- の void dog_wanメンバ関数が呼び出される。
98
-
99
-
100
-
101
- そうすると、Cat::dog_wan内の dog.wan() が呼び出される。
102
-
103
-
104
-
105
- と言う風になっています。
106
-
107
-
108
-
109
- そして、質問の dogとやらはなぜかCatクラスのメンバ変数として保持されています。
110
-
111
-
112
-
113
- ということは、『Catクラスのオブジェクトが存在している間』です。最大。
114
-
115
- (もちろん、何かしらのメンバとかで破棄したりとかしたら別です)
116
-
117
-
118
-
119
- で、main関数内での return 0 のときに 関数のブロックから抜けるので、catオブジェクトが破棄されるのはこの前後でしょうね。
120
-
121
-
122
-
123
- そして、dogオブジェクトは catオブジェクトのメンバ変数なので最長、catオブジェクトが生きている間。です。
124
-
125
-
126
-
127
- だから、破棄されるとしたらcatオブジェクトが破棄されるときでしょうね
5
+ そうですね。catオブジェクトが破棄されるときだと思います(読み間違えていた……orz)
128
-
129
-
130
-
131
- なので、おそらく main関数での return 0 の周辺でしょうね。
132
-
133
-
134
-
135
- (もしかしたらmain関数からちゃんと抜けた後かもしれないが)
136
-
137
-
138
-
139
- > 25行目でCatを動的確保した場合においても、20行目のdogが破棄されるのは、catが解放(delete)されたタイミングで良いでしょうか
140
-
141
-
142
-
143
- まあ、そうですね。
144
-
145
-
146
-
147
- これはスタックじゃなくてヒープに設定されます。
148
-
149
-
150
-
151
- なので自分でdeleteしないといけないです。
152
-
153
- (まあ、終了時にOSが勝手にやってくれるらしいが、OS依存ですから、やはりdeleteすべきですね)
154
-
155
-
156
-
157
- Javaとかだとガーベージコレクタ(gc)が勝手にやってくれるので、deleteは不要らしいですが。

2

追記0.1

2021/03/15 11:05

投稿

BeatStar
BeatStar

スコア4962

test CHANGED
@@ -133,3 +133,25 @@
133
133
 
134
134
 
135
135
  (もしかしたらmain関数からちゃんと抜けた後かもしれないが)
136
+
137
+
138
+
139
+ > 25行目でCatを動的確保した場合においても、20行目のdogが破棄されるのは、catが解放(delete)されたタイミングで良いでしょうか
140
+
141
+
142
+
143
+ まあ、そうですね。
144
+
145
+
146
+
147
+ これはスタックじゃなくてヒープに設定されます。
148
+
149
+
150
+
151
+ なので自分でdeleteしないといけないです。
152
+
153
+ (まあ、終了時にOSが勝手にやってくれるらしいが、OS依存ですから、やはりdeleteすべきですね)
154
+
155
+
156
+
157
+ Javaとかだとガーベージコレクタ(gc)が勝手にやってくれるので、deleteは不要らしいですが。

1

追記0

2021/03/15 10:44

投稿

BeatStar
BeatStar

スコア4962

test CHANGED
@@ -70,6 +70,42 @@
70
70
 
71
71
 
72
72
 
73
+ そして、(2)のときに Cat::dog_wan() が呼び出されるので
74
+
75
+
76
+
77
+ ```ここに言語を入力
78
+
79
+ class Cat{
80
+
81
+ public:
82
+
83
+ void dog_wan(){
84
+
85
+ dog.wan();
86
+
87
+ }
88
+
89
+ private:
90
+
91
+ Dog dog;
92
+
93
+ };
94
+
95
+ ```
96
+
97
+ の void dog_wanメンバ関数が呼び出される。
98
+
99
+
100
+
101
+ そうすると、Cat::dog_wan内の dog.wan() が呼び出される。
102
+
103
+
104
+
105
+ と言う風になっています。
106
+
107
+
108
+
73
109
  そして、質問の dogとやらはなぜかCatクラスのメンバ変数として保持されています。
74
110
 
75
111