回答編集履歴
2
追加
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
訂正
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メソッドであっても、ローカル変数は呼ばれるたびに作られ終了と共に解放されます)~~
|