問題タブ [reference-counting]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
objective-c - 何が自動的に保持および解放されますか?
何が自動的に保持および解放されるかはある程度理解しましたが、これに関する公式データが見つからず、何か問題があったと思います。
- @property(retain)で宣言されたプロパティを設定すると、古い値が保持および解放されますが、同じオブジェクト内にプロパティを設定することはできません。
self.
- メソッド内のすべてのオブジェクト(パラメーターを含む)は、作成/渡されたときに保持され、メソッドが戻ったときに解放されます。
- メソッドによって返されるオブジェクトは解放されませんが、代わりに、メソッド内のローカル変数以降、返されたメソッドによって解放されます。
私は何か間違ったことをした/何かを忘れましたか?
返品が破棄されるとどうなりますか?のように[object someMethodThatReturnsAnObject];
。返されるメソッドに対してローカルではないため、リリースされるかどうかはわかりませんが、xCodeはそれについて警告します。
string - この文字列の参照カウントが 4 なのはなぜですか? (デルファイ 2007)
これは非常に Delphi 固有の質問です (おそらく Delphi 2007 固有の質問です)。現在、文字列をインターンするための単純な StringPool クラスを作成しています。優秀なコーダーとして、単体テストも追加しましたが、困惑するものを見つけました。
これはインターンのコードです:
FList はソートされた TStringList であるため、コードはリスト内の文字列を検索し、リスト内の文字列が既に存在する場合は既存の文字列を返します。まだリストにない場合は、最初に UniqueString を呼び出して参照カウントが 1 であることを確認してから、リストに追加します。(結果の参照カウントを確認したところ、予想どおり 'hallo' が 2 回追加された後で 3 になっています。)
テストコードに移りましょう:
これにより、文字列 'hallo' が文字列プールに 2 回追加され、文字列の参照カウントがチェックされ、s1 と s2 が実際に同じ文字列記述子を指していることも確認されます。
すべての CheckEquals は期待どおりに機能しますが、最後です。「expected: <3> but was: <4>」というエラーで失敗します。
では、なぜここで参照カウントが 4 なのですか? 私は3を期待していたでしょう:
- s1
- s2
- および StringList 内の別の 1 つ
これは Delphi 2007 であるため、文字列は AnsiStrings です。
そうそう、関数 StringReferenceCount は次のように実装されています。
デバッガーでは、同じものを次のように評価できます。
Sergからの回答に追加するだけです(これは100%正しいようです):
交換したら
と
次に、s3(およびs1)の参照カウントを確認すると、予想どおり3です。この現象を引き起こすのは、FPool.Intern(s2) の結果を s2 に再度代入したためです (s2 は、パラメーターと関数結果の宛先の両方です)。Delphi では、結果を代入する隠し文字列変数が導入されています。
また、関数をプロシージャに変更すると、次のようになります。
隠し変数が必要ないため、参照カウントは予想どおり 3 です。
誰かがこの TStringPool 実装に興味を持っている場合: これは MPL の下でオープン ソースであり、dzchart の一部である dzlib の一部として利用できます。
https://sourceforge.net/p/dzlib/code/HEAD/tree/dzlib/trunk/src/u_dzStringPool.pas
しかし、上で述べたように、それは厳密にはロケット科学ではありません。;-)
iphone - Why retain/release rather than new/delete?
I'm newbie to objective-C, I feel comportable in C++.
My question is: Why language designer of obj-c proper to use retain/release rather then use new/delete(=alloc/dealloc) only?
Maybe my brain is fit to new/delete only memory management, I can not understand why I should manage reference counts, I think I know when object have to be alloc/dealloc with my C++ experence.
(Yes, I spend 4 hours to debug reference count problem, it is resolved by 1 line "release")
Can anyone explain me what is better when we use reference counter? (in programming language respects) I think I can manage lifecycle of object by new/delete, but I can't with reference counting.
I need long article that explains why reference counter is useful, if you have link.
P.S: I heard about Compile-time Automatic Reference Counting at WWDC 2011, it is really awesome, it can be reason of use of reference counter, for example.
python - Pythonオブジェクトを強制的に削除するにはどうすればよいですか?
__del__
Pythonの詳細、いつ、なぜ使用する必要があるのか、何に使用しないのかについて興味があります。__new__
/の反対ではないという点で、デストラクタに素朴に期待されるものとは実際には似ていないという難しい方法を学びました__init__
。
ドキュメントで、インタプリタの終了時にまだ存在するオブジェクトに対してメソッドが呼び出される ことが保証されていないことを確認しました。__del__()
Foo
インタプリタが終了するときに存在するインスタンスについて、バーが閉じていることをどのように保証できますか?- 上記のコードスニペットでは、バーはオン
del foo
またはオンで閉じられgc.collect()
ますか...またはどちらでもありませんか?これらの詳細をより細かく制御したい場合(たとえば、オブジェクトが参照されていないときにバーを閉じる必要がある場合)、それを実装する通常の方法は何ですか? - いつ呼び出されるかは、すでに呼び出されている
__del__
ことが保証されていますか?上げられ__init__
たらどうですか?__init__
java - 参照カウントは良い設計です
受信したリクエストと送信したレスポンスを追跡するメカニズムとして参照カウントを使用するアプリケーション コンテナに取り組んでいます。参照カウントは、コンテナーの正常なシャットダウンを許可するために使用されます。つまり、if (refCount == 0) shutdown;
参照カウントは、リクエストごとにインクリメントされ、保留中のレスポンスに対してもインクリメントされます。参照カウントは、アプリケーションが要求を受け入れた場合と、アプリケーションが有効な応答を送信した場合にのみ減分されます。だからここに私の質問がRequestContext
あります.アプリケーション/コンテナが応答を送信したときにのみ閉じられる a を保持するのと比較して、参照カウントはこのシナリオで良い設計上の決定ですか?
ソフトウェアは Java で実装されているため、Java の他のオプションを調べていたところ、 http://weblogs.java.net/blog/2006/05/04/understanding-weak-referencesという記事に出くわしました。を活用するReferenceQueue
ことは、これを行うための別のアプローチになる可能性があります。
python - Python C 拡張機能のこのブロックのどこに Py_INCREF と Py_DECREF を配置すればよいですか?
関数を呼び出すたびに、呼び出しごとにメモリ使用量が約 +10M 増加するため、ここでメモリ リークが発生していると思われます。
ドキュメントを読むと、次のような呼び出しがいくつかあります
このような参照カウントを配置する必要があります
では、関数のどこに Py_INCREF と Py_DECREF を配置すればよいでしょうか?
com - VB6 の AddRef()
Visual Basic 6 でインターフェイス IUnknown からメソッド AddRef() を呼び出すか、オブジェクト参照カウンターをインクリメントするためのハックを実装することは可能ですか?
objective-c - 適切である(保持される)@propertyにself.string = @ ""を割り当てていますか?
ある種の哲学的な質問。(保持されている)@propertyに定数文字列を割り当てるのは適切ですか?または、私はする必要がありself.string = [NSString stringWithString:@""]
ます;
メモリリークはありますか?過剰リリースされた場合はどうなりますか?
これは定数文字列なので、NSStringオブジェクトと同じように動作しますか?
プロパティが(割り当て)の場合、それは実行ループの後で有効ではないことを意味しますか?
c++ - シェーダー クラスの設計
私は OpenGL の学習を始めたので、C っぽいコードの過度の使用によって明らかに引き起こされている吐き気を避けるために、(自分用に) 小さな C++ フレームワークを作成したほうがよいと考えました。:)
私は Qt に固執するつもりなので、フレームワークはいくつかの Qt クラスを使用します。
最初に本当に必要だったのは、シェーダーとプログラムを簡単に使用する方法でした。これがシェーダークラスの私の考えです。
さまざまな機能が何をしているかは明らかです。それぞれが関連する OpenGL ルーチンを呼び出し、エラーをチェックし、エラーが発生した場合は例外をスローします。コンストラクターは を呼び出しますglCreateShader
。今、トリッキーな部分です。デストラクタを呼び出す必要がありますglDeleteShader(handle);
が、この場合、ジレンマがあります。
オプション 1:割り当てとコピーを無効にします。これには、参照カウントを回避するという利点と、共有ポインタを使用してこれらをベクトルに配置し、一般的に渡す必要があるという欠点があります。
オプション 2:参照カウントを有効にします。これには、コピーを有効にして、コンテナーに格納できるという明らかな利点があります (後で、さまざまなシェーダーをプログラムに渡す必要があります)。欠点は次のとおりです。
ご覧のとおり、s1 のソースを s2 経由で変更しました。これらは同じ内部シェーダー ハンドルを共有しているためです。正直なところ、ここでは大きな問題は見られません。私はクラスを書いたので、そのコピーセマンティクスがこのようなものであることはわかっており、問題ありません。問題は、この種の設計が受け入れられるかどうか確信が持てないことです。これはすべて Option1 + 共有ポインターで実現できますが、シェーダーを作成するたびに共有ポインターを持ちたくないという唯一の違いがあります (パフォーマンス上の理由ではなく、構文上の利便性のためです)。
Q1:オプションと、必要に応じてアイデア全体についてコメントしてください。1
Q2:オプション 2 を選択した場合、それを自分で実装する必要がありますか? または、boost または Qt に、派生またはメンバーを持つ準備ができたクラスがあり、無料の参照カウントを取得できますか?
Q3:Shader
抽象クラスを作成し、3 つの派生クラスVertexShader
、FragmentShader
、およびGeometryShader
を作成するのはやり過ぎだということに同意しますか?
1私に既存の C++ OpenGL フレームワークを紹介してくれるなら、それは非常に良いことですが (私は実際に見つけたことがなかったので)、それは私の質問への回答というよりは補足的なものにすべきです。また、ドキュメントのどこかに QGLShader クラスを見たことがありますが、私のバージョンの Qt には明らかに存在せず、今すぐアップグレードを避ける理由があります。
アップデート
答えてくれてありがとう。最終的に、ソース関数を削除して、シェーダー クラスを不変にすることにしました。シェーダーは作成時にコンパイルされ、const 以外のメンバー関数はありません。したがって、単純な参照カウントは、すべての問題を一度に解決します。