0

C でインタープリターを作成していますが、参照カウントに問題があります。

それぞれvalue(値のインタープリターの表現です...)にはrefcount0が割り当てられます。スタックに追加されると、refcount.

valueスタックをオフにする唯一の方法はポップすることですが、これは問題を引き起こします。私のポッピング関数は、valueポップされた を返しますが、refcountが 0 で値を破棄すると、それを返すことができなくなります。

おそらくチェックを別の場所に置くべきだと思いrefcountますが、ポップ機能を使用する場所がたくさんあるので、それは見苦しく思えます。

この問題を回避するにはどうすればよいですか? この場合、実際の G​​C アルゴリズムを実装する必要がありますか?

4

3 に答える 3

1

私は、一種の参照カウントも使用する独自のデータベース システムを使用しています。

オブジェクトがデータベースに格納されると、その refcount がインクリメントされます。データベースからオブジェクトを取得すると、その参照カウントは変更されません。オブジェクトが何らかの方法で削除された場合にのみ減少します (通常、オブジェクトを含むデータベースの削除、またはオブジェクトを含むデータベース内の別のオブジェクトによる置換)。オブジェクトが実際に破棄されるのは、refcount が 0 であり、かつ削除が必要な場合のみです。

于 2015-06-29T10:01:45.917 に答える
0

原則として、参照を作成するときはカウントを増やし、参照を削除するときは減らします。しかし、3 番目のタイプのトランザクション (または 2 つの最適化された構成) もあります。ここでは、転送のみが行われ、カウントはまったく変更されません。

これは、スタックから値をポップし、その値を (ローカル変数で) 使用する場合に当てはまります。オブジェクトは最初はスタック上にあり、現在は変数内にあります。しかし、まだ 1 つのオブジェクトしかありません。参照カウントは、処理が完了して参照を破棄する準備ができるまで変更されません。

于 2015-07-09T08:45:00.007 に答える
0

ケースでオブジェクトまたは値を作成するときはいつでも、refcount を 1 に設定する必要があります。スタックにプッシュするときに、それをインクリメントします。ポップすると、デクリメントします。pop 操作ごとにデクリメントして refcount をチェックし、refcount がゼロの場合は値を破棄します。どの関数 destoy-value が既に実行されているので、pop でその関数を呼び出すだけで済みます。

于 2015-06-29T10:19:33.163 に答える