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

回答編集履歴

3

勘違い

2021/03/15 11:05

投稿

BeatStar
BeatStar

スコア4962

answer CHANGED
@@ -1,79 +1,3 @@
1
1
  > 20行目にあるdogが破棄されるのは25行目のcatが破棄されるタイミングで良いでしょうか
2
2
 
3
- 多分違います。
4
-
5
- コードだけを見ても意味ないです。
6
-
7
- スタックガ―とかヒープガ―とかは置いといてください。
8
-
9
- **こういう場合は『プログラム目線』で考えてください。**
10
-
11
-
12
- C/C++の場合はmain関数、C#やJavaの場合はmainメソッドから開始します。
13
- Pythonとかは……まあ、置いといて。
14
-
15
- で、今回はC++なので main関数から始まります。
16
-
17
- ```C++
18
- int main(){
19
- Cat cat;
20
- cat.dog_wan();
21
- return 0;
22
- }
23
- ```
24
-
25
- なので、main関数に潜ります。
26
-
27
- すると、
28
-
29
- ```ここに言語を入力
30
- 1. Catクラスでcatオブジェクトが生成される
31
- 2. catのdog_wan() が呼び出される
32
- 3. 終了
33
- ```
34
-
35
- となっています。
36
-
37
- そして、(2)のときに Cat::dog_wan() が呼び出されるので
38
-
39
- ```ここに言語を入力
40
- class Cat{
41
- public:
42
- void dog_wan(){
43
- dog.wan();
44
- }
45
- private:
46
- Dog dog;
47
- };
48
- ```
49
- の void dog_wanメンバ関数が呼び出される。
50
-
51
- そうすると、Cat::dog_wan内の dog.wan() が呼び出される。
52
-
53
- と言う風になっています。
54
-
55
- そして、質問の dogとやらはなぜかCatクラスのメンバ変数として保持されています。
56
-
57
- ということは、『Catクラスのオブジェクトが存在している間』です。最大。
58
- (もちろん、何かしらのメンバとかで破棄したりとかしたら別です)
59
-
60
- で、main関数内での return 0 のときに 関数のブロックから抜けるので、catオブジェクトが破棄されるのはこの前後でしょうね。
61
-
62
- そして、dogオブジェクトは catオブジェクトのメンバ変数なので最長、catオブジェクトが生きている間。です。
63
-
64
- だから、破棄されるとしたらcatオブジェクトが破棄されるときでしょうね
3
+ そうですね。catオブジェクトが破棄されるときだと思います(読み間違えていた……orz)
65
-
66
- なので、おそらく main関数での return 0 の周辺でしょうね。
67
-
68
- (もしかしたらmain関数からちゃんと抜けた後かもしれないが)
69
-
70
- > 25行目でCatを動的確保した場合においても、20行目のdogが破棄されるのは、catが解放(delete)されたタイミングで良いでしょうか
71
-
72
- まあ、そうですね。
73
-
74
- これはスタックじゃなくてヒープに設定されます。
75
-
76
- なので自分でdeleteしないといけないです。
77
- (まあ、終了時にOSが勝手にやってくれるらしいが、OS依存ですから、やはりdeleteすべきですね)
78
-
79
- Javaとかだとガーベージコレクタ(gc)が勝手にやってくれるので、deleteは不要らしいですが。

2

追記0.1

2021/03/15 11:05

投稿

BeatStar
BeatStar

スコア4962

answer CHANGED
@@ -65,4 +65,15 @@
65
65
 
66
66
  なので、おそらく main関数での return 0 の周辺でしょうね。
67
67
 
68
- (もしかしたらmain関数からちゃんと抜けた後かもしれないが)
68
+ (もしかしたらmain関数からちゃんと抜けた後かもしれないが)
69
+
70
+ > 25行目でCatを動的確保した場合においても、20行目のdogが破棄されるのは、catが解放(delete)されたタイミングで良いでしょうか
71
+
72
+ まあ、そうですね。
73
+
74
+ これはスタックじゃなくてヒープに設定されます。
75
+
76
+ なので自分でdeleteしないといけないです。
77
+ (まあ、終了時にOSが勝手にやってくれるらしいが、OS依存ですから、やはりdeleteすべきですね)
78
+
79
+ Javaとかだとガーベージコレクタ(gc)が勝手にやってくれるので、deleteは不要らしいですが。

1

追記0

2021/03/15 10:44

投稿

BeatStar
BeatStar

スコア4962

answer CHANGED
@@ -34,6 +34,24 @@
34
34
 
35
35
  となっています。
36
36
 
37
+ そして、(2)のときに Cat::dog_wan() が呼び出されるので
38
+
39
+ ```ここに言語を入力
40
+ class Cat{
41
+ public:
42
+ void dog_wan(){
43
+ dog.wan();
44
+ }
45
+ private:
46
+ Dog dog;
47
+ };
48
+ ```
49
+ の void dog_wanメンバ関数が呼び出される。
50
+
51
+ そうすると、Cat::dog_wan内の dog.wan() が呼び出される。
52
+
53
+ と言う風になっています。
54
+
37
55
  そして、質問の dogとやらはなぜかCatクラスのメンバ変数として保持されています。
38
56
 
39
57
  ということは、『Catクラスのオブジェクトが存在している間』です。最大。