いろいろ勘違いがあったようですm(_ _)m
Matrix4x4
やVector4
は、値型であるためスタックメモリの上に作られます。
mat
はMatrix4x4
型のため、スタックメモリに確保され、=によって直接値が代入されます。
その後の操作を経て、return mat;
に到達したとき、
呼び出し元へと値を返すために、mat
の値のコピーが作られます。
そして、メソッドの終了と共に、スタックメモリ上にあるmat
の情報は解放されます。
スタックメモリ上にあるデータは、GCの管理外なので、GCは関わってきません。
呼び出し元には、さっき作ったコピーの値が渡されます。
呼び出し元が変数を用意してそれを受け取っていた場合、その値がその変数へと格納されて、
コピー自体は役目を終えて消えます。
このnewしたVectorはmatが参照されなくなってGCが走ると破棄される、で理解はあっていますでしょうか?
なので、参照とは関係なく、この時newしたVectorそのものは、メソッドの終了と共に破棄されます。
しかし、returnを通じて、その値のコピーは呼び出し元に渡される。といった感じになるかと思います。
ついでに、ではもしnewされたものが、参照型のものであったなら、ですが、
この場合は、GCの対象になるのは、そのインスタンスへの参照が1つもなくなった時です。
GCは全ての参照変数の参照先をチェックして、それを元に各インスタンスに参照されているかどうかのマークを付けます。
その結果、マークされていない=どの変数からも参照されていないインスタンスはGCの対象となります。
このコードでいえば、mat
に参照が代入された時点で、インスタンスは参照されている状態です。
確かに、このまま何もせずに、mat
が無効になれば、どこからも参照が無くなり、GCの対象となります。
しかし、このコードでは、return mat;
として、メソッドの外にインスタンスへ参照を返しています。
当然、このメソッドを呼び出した側では、それを受け取っていると思います。(絶対ではないですが)
この外部の参照がある限り、たとえメソッドの終了により、mat
が破棄されても、
作られたインスタンスの参照は無くなりません。
その為、メソッドの終了後もその参照がある限りインスタンスはGCの対象にはならず、生き続けます。
(もしメソッドを呼び出した側が返り値を受け取っていなければ、メソッドの終了時点でGC対象になります)
作られた場所がstaticメソッドであるかどうかは、あまり関係がありません。
(staticメソッドであっても、ローカル変数は呼ばれるたびに作られ終了と共に解放されます)
このnewしたVectorはmatが参照されなくなってGCが走ると破棄される、で理解はあっていますでしょうか?
GCの対象になるのは、そのインスタンスへの参照が一つもなくなった時です。
このコードでいえば、mat
に参照が代入された時点で、インスタンスへの参照は1となります。
確かに、このまま何もせずに、mat
が無効になれば、被参照数も0となり、GCの対象となります。
しかし、このコードでは、return mat;
として、メソッドの外にインスタンスを返しています。
当然、このメソッドを呼び出した側では、それを受け取っていると思います。(絶対ではないですが)
この外部の参照がある限り、たとえメソッドの終了により、mat
が破棄されても、
作られたインスタンスの被参照数は0にはなりません。
その為、メソッドの終了後もその参照がある限りインスタンスはGCの対象にはならず、生き続けます。
(もしメソッドを呼び出した側が返り値を受け取っていなければ、メソッドの終了時点でGC対象になります)
作られた場所がstaticメソッドであるかどうかは、あまり関係がありません。
(staticメソッドであっても、ローカル変数は呼ばれるたびに作られ終了と共に解放されます)
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/04/13 12:12
2021/04/14 00:31
2021/04/14 01:33