回答編集履歴
2
追加
test
CHANGED
@@ -34,6 +34,42 @@
|
|
34
34
|
|
35
35
|
|
36
36
|
|
37
|
+
---
|
38
|
+
|
39
|
+
|
40
|
+
|
41
|
+
ついでに、ではもしnewされたものが、参照型のものであったなら、ですが、
|
42
|
+
|
43
|
+
この場合は、GCの対象になるのは、そのインスタンスへの参照が1つもなくなった時です。
|
44
|
+
|
45
|
+
GCは全ての参照変数の参照先をチェックして、それを元に各インスタンスに参照されているかどうかのマークを付けます。
|
46
|
+
|
47
|
+
その結果、マークされていない=どの変数からも参照されていないインスタンスはGCの対象となります。
|
48
|
+
|
49
|
+
|
50
|
+
|
51
|
+
このコードでいえば、`mat`に参照が代入された時点で、インスタンスは参照されている状態です。
|
52
|
+
|
53
|
+
確かに、このまま何もせずに、`mat`が無効になれば、どこからも参照が無くなり、GCの対象となります。
|
54
|
+
|
55
|
+
しかし、このコードでは、`return mat;`として、メソッドの外にインスタンスへ参照を返しています。
|
56
|
+
|
57
|
+
当然、このメソッドを呼び出した側では、それを受け取っていると思います。(絶対ではないですが)
|
58
|
+
|
59
|
+
この外部の参照がある限り、たとえメソッドの終了により、`mat`が破棄されても、
|
60
|
+
|
61
|
+
作られたインスタンスの参照は無くなりません。
|
62
|
+
|
63
|
+
その為、メソッドの終了後もその参照がある限りインスタンスはGCの対象にはならず、生き続けます。
|
64
|
+
|
65
|
+
(もしメソッドを呼び出した側が返り値を受け取っていなければ、メソッドの終了時点でGC対象になります)
|
66
|
+
|
67
|
+
|
68
|
+
|
69
|
+
作られた場所がstaticメソッドであるかどうかは、あまり関係がありません。
|
70
|
+
|
71
|
+
(staticメソッドであっても、ローカル変数は呼ばれるたびに作られ終了と共に解放されます)
|
72
|
+
|
37
73
|
|
38
74
|
|
39
75
|
|
1
訂正
test
CHANGED
@@ -1,8 +1,50 @@
|
|
1
|
+
いろいろ勘違いがあったようですm(_ _)m
|
2
|
+
|
3
|
+
|
4
|
+
|
5
|
+
`Matrix4x4`や`Vector4`は、値型であるためスタックメモリの上に作られます。
|
6
|
+
|
7
|
+
`mat`は`Matrix4x4`型のため、スタックメモリに確保され、=によって直接値が代入されます。
|
8
|
+
|
9
|
+
その後の操作を経て、`return mat;`に到達したとき、
|
10
|
+
|
11
|
+
呼び出し元へと値を返すために、`mat`の値のコピーが作られます。
|
12
|
+
|
13
|
+
そして、メソッドの終了と共に、スタックメモリ上にある`mat`の情報は解放されます。
|
14
|
+
|
15
|
+
スタックメモリ上にあるデータは、GCの管理外なので、GCは関わってきません。
|
16
|
+
|
17
|
+
|
18
|
+
|
19
|
+
呼び出し元には、さっき作ったコピーの値が渡されます。
|
20
|
+
|
21
|
+
呼び出し元が変数を用意してそれを受け取っていた場合、その値がその変数へと格納されて、
|
22
|
+
|
23
|
+
コピー自体は役目を終えて消えます。
|
24
|
+
|
25
|
+
|
26
|
+
|
1
27
|
> このnewしたVectorはmatが参照されなくなってGCが走ると破棄される、で理解はあっていますでしょうか?
|
2
28
|
|
3
29
|
|
4
30
|
|
31
|
+
なので、参照とは関係なく、この時newしたVectorそのものは、メソッドの終了と共に破棄されます。
|
32
|
+
|
33
|
+
しかし、returnを通じて、その値のコピーは呼び出し元に渡される。といった感じになるかと思います。
|
34
|
+
|
35
|
+
|
36
|
+
|
37
|
+
|
38
|
+
|
39
|
+
|
40
|
+
|
41
|
+
---
|
42
|
+
|
43
|
+
> このnewしたVectorはmatが参照されなくなってGCが走ると破棄される、で理解はあっていますでしょうか?
|
44
|
+
|
45
|
+
|
46
|
+
|
5
|
-
GCの対象になるのは、そのインスタンスへの参照が一つもなくなった時です。
|
47
|
+
~~GCの対象になるのは、そのインスタンスへの参照が一つもなくなった時です。
|
6
48
|
|
7
49
|
このコードでいえば、`mat`に参照が代入された時点で、インスタンスへの参照は1となります。
|
8
50
|
|
@@ -18,10 +60,10 @@
|
|
18
60
|
|
19
61
|
その為、メソッドの終了後もその参照がある限りインスタンスはGCの対象にはならず、生き続けます。
|
20
62
|
|
21
|
-
(もしメソッドを呼び出した側が返り値を受け取っていなければ、メソッドの終了時点でGC対象になります)
|
63
|
+
(もしメソッドを呼び出した側が返り値を受け取っていなければ、メソッドの終了時点でGC対象になります)~~
|
22
64
|
|
23
65
|
|
24
66
|
|
25
|
-
作られた場所がstaticメソッドであるかどうかは、あまり関係がありません。
|
67
|
+
~~作られた場所がstaticメソッドであるかどうかは、あまり関係がありません。
|
26
68
|
|
27
|
-
(staticメソッドであっても、ローカル変数は呼ばれるたびに作られ終了と共に解放されます)
|
69
|
+
(staticメソッドであっても、ローカル変数は呼ばれるたびに作られ終了と共に解放されます)~~
|