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

回答編集履歴

2

追加

2021/04/14 00:49

投稿

amiya
amiya

スコア1218

answer CHANGED
@@ -16,8 +16,26 @@
16
16
  なので、参照とは関係なく、この時newしたVectorそのものは、メソッドの終了と共に破棄されます。
17
17
  しかし、returnを通じて、その値のコピーは呼び出し元に渡される。といった感じになるかと思います。
18
18
 
19
+ ---
19
20
 
21
+ ついでに、ではもしnewされたものが、参照型のものであったなら、ですが、
22
+ この場合は、GCの対象になるのは、そのインスタンスへの参照が1つもなくなった時です。
23
+ GCは全ての参照変数の参照先をチェックして、それを元に各インスタンスに参照されているかどうかのマークを付けます。
24
+ その結果、マークされていない=どの変数からも参照されていないインスタンスはGCの対象となります。
20
25
 
26
+ このコードでいえば、`mat`に参照が代入された時点で、インスタンスは参照されている状態です。
27
+ 確かに、このまま何もせずに、`mat`が無効になれば、どこからも参照が無くなり、GCの対象となります。
28
+ しかし、このコードでは、`return mat;`として、メソッドの外にインスタンスへ参照を返しています。
29
+ 当然、このメソッドを呼び出した側では、それを受け取っていると思います。(絶対ではないですが)
30
+ この外部の参照がある限り、たとえメソッドの終了により、`mat`が破棄されても、
31
+ 作られたインスタンスの参照は無くなりません。
32
+ その為、メソッドの終了後もその参照がある限りインスタンスはGCの対象にはならず、生き続けます。
33
+ (もしメソッドを呼び出した側が返り値を受け取っていなければ、メソッドの終了時点でGC対象になります)
34
+
35
+ 作られた場所がstaticメソッドであるかどうかは、あまり関係がありません。
36
+ (staticメソッドであっても、ローカル変数は呼ばれるたびに作られ終了と共に解放されます)
37
+
38
+
21
39
  ---
22
40
  > このnewしたVectorはmatが参照されなくなってGCが走ると破棄される、で理解はあっていますでしょうか?
23
41
 

1

訂正

2021/04/14 00:49

投稿

amiya
amiya

スコア1218

answer CHANGED
@@ -1,6 +1,27 @@
1
+ いろいろ勘違いがあったようですm(_ _)m
2
+
3
+ `Matrix4x4`や`Vector4`は、値型であるためスタックメモリの上に作られます。
4
+ `mat`は`Matrix4x4`型のため、スタックメモリに確保され、=によって直接値が代入されます。
5
+ その後の操作を経て、`return mat;`に到達したとき、
6
+ 呼び出し元へと値を返すために、`mat`の値のコピーが作られます。
7
+ そして、メソッドの終了と共に、スタックメモリ上にある`mat`の情報は解放されます。
8
+ スタックメモリ上にあるデータは、GCの管理外なので、GCは関わってきません。
9
+
10
+ 呼び出し元には、さっき作ったコピーの値が渡されます。
11
+ 呼び出し元が変数を用意してそれを受け取っていた場合、その値がその変数へと格納されて、
12
+ コピー自体は役目を終えて消えます。
13
+
1
14
  > このnewしたVectorはmatが参照されなくなってGCが走ると破棄される、で理解はあっていますでしょうか?
2
15
 
16
+ なので、参照とは関係なく、この時newしたVectorそのものは、メソッドの終了と共に破棄されます。
17
+ しかし、returnを通じて、その値のコピーは呼び出し元に渡される。といった感じになるかと思います。
18
+
19
+
20
+
21
+ ---
22
+ > このnewしたVectorはmatが参照されなくなってGCが走ると破棄される、で理解はあっていますでしょうか?
23
+
3
- GCの対象になるのは、そのインスタンスへの参照が一つもなくなった時です。
24
+ ~~GCの対象になるのは、そのインスタンスへの参照が一つもなくなった時です。
4
25
  このコードでいえば、`mat`に参照が代入された時点で、インスタンスへの参照は1となります。
5
26
  確かに、このまま何もせずに、`mat`が無効になれば、被参照数も0となり、GCの対象となります。
6
27
  しかし、このコードでは、`return mat;`として、メソッドの外にインスタンスを返しています。
@@ -8,7 +29,7 @@
8
29
  この外部の参照がある限り、たとえメソッドの終了により、`mat`が破棄されても、
9
30
  作られたインスタンスの被参照数は0にはなりません。
10
31
  その為、メソッドの終了後もその参照がある限りインスタンスはGCの対象にはならず、生き続けます。
11
- (もしメソッドを呼び出した側が返り値を受け取っていなければ、メソッドの終了時点でGC対象になります)
32
+ (もしメソッドを呼び出した側が返り値を受け取っていなければ、メソッドの終了時点でGC対象になります)~~
12
33
 
13
- 作られた場所がstaticメソッドであるかどうかは、あまり関係がありません。
34
+ ~~作られた場所がstaticメソッドであるかどうかは、あまり関係がありません。
14
- (staticメソッドであっても、ローカル変数は呼ばれるたびに作られ終了と共に解放されます)
35
+ (staticメソッドであっても、ローカル変数は呼ばれるたびに作られ終了と共に解放されます)~~