質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

2回答

1557閲覧

削除されるオブジェクトの変数をいじる意味

退会済みユーザー

退会済みユーザー

総合スコア0

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

1グッド

1クリップ

投稿2016/09/17 07:29

質問内容はタイトルの通りです。削除される予定のオブジェクトの変数をいじっているコードを見たのですが、意味はないように思えます。
「行儀がいい」のかもしれないですが、そこに変数を書き換えるという処理を必要とするので、むしろ望ましくないように思えるのですが、どうでしょうか?

双方向連結リストのNodeがあって、次のノードを指し示すnextと前のノードを指し示すprevをメンバとして保持しています。
そして、あるノードを削除するときはそのノードの次のノードのprevを書き換え、そのノードの前のノードのnextを書き換えることで削除します。
そして、どの変数にも参照されなくなったNodeはGCにより削除されます。
よって、削除するときには単に前後のノードのnextとprevを書き換えるだけで十分なのですが、削除されるノードのprevとnextをnullにしているコードを見ました。
すなわち、次のような感じです。

Java

1void delete(Node node) { 2 //前後のノードのnextとprevを置き換える 3 4 node.next = null; 5 node.prev = null;

この最後の部分の削除されるノードのnextとprevをnullにする意味はなんなのでしょうか?

mpyw👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

解決済みですが回答します。
そもそも対象のノードが削除後どこからも参照されないという前提が成立しない可能性もあります。何らかの理由でそのノードがある変数に参照されていた場合、そのノードのnextを呼び、それに対してprevを呼んだ場合、本来の仕様なら元のノードに戻っていなければなりませんが、違うノードが返ってくる結果になります。
そもそもそのノードはリストから除外されているのですから、そのノードからリストをたどれるということ自体、おかしな事になります。そのような不整合が起きないように、対象のノードのnextおよびprevをnullにしているのでしょう。

投稿2016/09/21 07:18

swordone

総合スコア20651

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KSwordOfHaste

2016/09/21 09:19

なるほど…そちらこそがより実際的な理由ですね。GCはそれに比べれば大した根拠ではないですね。失礼しました。
guest

0

ベストアンサー

Garbage collectorが使用中のオブジェクトをたどる際に不必要と分かっているオブジェクトを無駄に辿ってしまう可能性をできるだけ早く無くしたいということだと思います。

この例でいえば削除したNodeへの参照がスタックやフィールドに残っている期間中はまだこのNodeは生きているわけで、その期間がいつまで続くかはNodeクラスの使い方次第なのでNodeクラスの実装者は責任を持てません。しかしNodeは自身が保持している他のオブジェクトの参照が必要なくなった時点でなくす(nullを入れておく)ということはできます。こうしておけば、何らかの理由で削除したNodeへの参照が長期間残ってもそのNodeのprev/nextに繋がっているオブジェクトまで道ずれにせずに済みます。

投稿2016/09/17 08:39

KSwordOfHaste

総合スコア18394

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/09/17 11:53

回答ありがとうございます。 あまり意味が取れなかったと思います。 少しお付き合いいただければ、ありがたいです。 回答の中での「削除したNode」というのはコード上は削除した、という意味でよろしいでしょうか? >その期間がいつまで続くかはNodeクラスの使い方次第 削除した際に前後のノードのnextとprevを適切に書き換えることにより、コード上で削除した際に、その削除したノードへの参照はなくなるわけですから、使い方に依存はしないと思うのですが、どうなのでしょうか? >道連れにせずに済む 「道連れにせずに済む」というのは削除したノードのnextとprevにnullを設定しなかった場合、もしもそのノードが何らかの原因で残ってしまった場合、nextとprevで参照されるノードは確実に削除されなくなってしまうことになる、という意味で使われていますでしょうか?
KSwordOfHaste

2016/09/17 13:46

>削除したNode 例がdeleteメソッドとなっていたのでdeleteメソッドが呼ばれたNodeという意味で使っています。 >コード上で削除した際に、その削除したノードへの参照はなくなるわけですから ご質問にあるのはNodeクラス実装のごく一部のコードの断片です。よってそれだけでprev/nextをこう扱うから問題があるかないかといった議論を進めてみてもあまり有意義ではない気がします。私は考えられる色々なケースを想定すると問題となる可能性があると示唆しているだけなのです。Nodeを例にして考えられる例を一つ上げましょう。 ...A<->B<->C<->... このようになっていてB,A,Cの順にdeleteし、(Nodeの利用者が)Bの参照を残してしまった場合(それがバグかどうかはおいて)BからA,Cへの参照が残っているよりは残っていない方が望ましいという考え方ができます。 >道連れ おっしゃるとおりの意味で使っています。
退会済みユーザー

退会済みユーザー

2016/09/18 09:20

回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問