問題タブ [static-variables]
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.
c - 静的関数スコープのポインタとメモリリーク
任意のサイズのファイルから行を読み取る関数を備えた単純なライブラリファイルを作成しました。この関数は、スタックに割り当てられたバッファーとサイズを渡すことによって呼び出されますが、行が大きすぎる場合は、特別なヒープに割り当てられたバッファーが初期化され、より大きな行を返すために使用されます。
このヒープ割り当てバッファは、関数スコープで静的と宣言され、もちろん最初にNULLに初期化されます。関数の先頭に、ヒープバッファがnullでないかどうかを確認するためのチェックをいくつか記述しました。この場合、前の行の読み取りが長すぎました。当然、ヒープバッファを解放し、NULLに戻します。次の読み取りでは、スタックに割り当てられたバッファを埋めるだけでよいと考えています(このアプリケーションでも、1MBを超える行が表示されることは非常にまれです)。
私はコードを調べて、注意深く読んだり、いくつかのテストを実行したりして、かなり徹底的にテストしました。私は、次の不変条件が維持されていると合理的に確信しています。
- スタックバッファが必要なすべてである場合、ヒープバッファは関数の戻り時にnullになります(そしてメモリをリークしません)。
- ヒープバッファがnullでない場合、必要だったため、次の関数呼び出しで解放されます(必要に応じて、次の行で再利用される可能性があります)。
しかし、潜在的な問題について考えました。ファイルの最後の行が長すぎる場合、関数はおそらく再度呼び出されないため、ヒープバッファーを解放する方法がわかりません。これは関数です。 -スコープ、結局のところ。
だから私の質問は、理想的には関数を再度呼び出さずに、関数スコープの静的ポインタで動的に割り当てられたメモリを解放するにはどうすればよいですか?(そして理想的には、それをグローバル変数にすることなく!)
リクエストに応じて利用可能なコード。(今はアクセスできません。申し訳ありません。質問が十分に一般的で、必要ないように十分に説明されていることを願っていますが、ぜひその概念を私に非難してください!)
編集:関数の使用法についていくつかメモを追加する必要があると思います。
この特定の関数は、ファイルからシリアルに読み取られ、すぐにPOD構造体にコピーされる行の形式で使用されます(構造体ごとに1行)。これらは、ファイルが読み取られるときにヒープ上に作成され、これらの構造体のそれぞれには、ファイルからの行(のクリーンアップされたバージョン)を含むcharポインターがあります。これらが持続するためには、コピーがすでに発生している必要があります。(これは、多くの回答で提起された大きな反論の1つでした。ああ、いや、行をコピーする必要があります。
マルチスレッドに関しては、私が言ったように、これはシリアルに使用されるように設計されています。いいえ、スレッドセーフではありませんが、私は気にしません。
たくさんのご回答ありがとうございます!時間があればもっとよく読みます。fgets
現在、私は余分なポインターを渡すか、関数を再設計して、 EOFが表示されたときに、代わりに解放ロジックを構築するだけで、ユーザーがそれについて心配する必要がないようにすることに傾倒しています。
javascript - ポストバックのJavaScript関数で静的変数値を保持するにはどうすればよいですか?
以下にこのサンプルがあります。
ページのポストバックをクリックすると、初期化された変数(関数自体で定義されている)がその値を失い、再び「未定義」になっていることがわかりました。
それらが定義された後、それらの静的な値を保持し、ページ上のポストバックの影響を受けないようにすることは可能ですか?
c++ - インスタンスメソッドの静的変数
私がこのプログラムを持っているとしましょう:
(もちろん、この例は、明らかに「counter」をプライベート属性として宣言するので意味がありませんが、問題を説明するためだけのものです)。
このような状況でC++がどのように動作するかを知りたいのですが、bar()メソッドの変数「counter」はすべてのインスタンスで同じですか?
php - PHP:この関数は1回しか使用できません(whileループで使用)
私はほとんど機能している古い質問に対する答えを得ました。
私には機能があります、
このように使いたい
この機能は正常に動作しますが、1ページに1回しか使用できません。二度目にそれを呼んだとき、それは何もしません。エラーもありません。関数が発生しなかったようです。
複数回動作させ、whileループで動作させるには、何を変更する必要がありますか?
c - Cで別のファイルから静的変数にアクセスするには?
重複の可能性:
静的変数
Cで別のファイルから静的変数にアクセスするには? Static 変数にはファイル スコープがあるため、ファイルの外部にアクセスする方法はないと思います。それでも、同じことをするためのトリックや方法があるかもしれないと私は感じています.
c - 別のファイルから静的変数にアクセスするにはどうすればよいですか?
別のファイルから静的変数にアクセスするにはどうすればよいですか? 静的変数にはファイル スコープがありませんか?
c++ - 静的変数を使用して変数の初期化/登録を行っても問題ありませんか?
言語: C++ ツールキット: Qt4
私が使用しているツールキットにはint QEvent::registerEventType()
、独自のイベント タイプを登録するために呼び出される静的メソッドがあります。これをサブクラス化するときはQEvent
、基本クラスにこの値を提供する必要があります。QEvent::QEvent(int type)
.
アプリケーションが起動する前に静的変数を使用してこれを呼び出しても問題ありませんか? 次の点を考慮してください。
これはどのように「悪」ですか?全体を名前空間にラップして、グローバル名前空間の汚染を防ぐことができます。
php - 最適化のための静的変数
最適化のために静的変数を使用できるかどうか疑問に思っています:
$i
が初期化されると、 への連続した呼び出しでそのコード行によって変更されないことを私は知っていBar()
ます。これは、呼び出すmoderatelyExpensiveFunctionCall()
たびに評価されないことを意味すると思いますが、確実に知りたいです。
PHP は、初期化された静的変数を検出すると、そのコード行をスキップしますか? 言い換えると、 をたくさん呼び出した場合、実行時間が最適化されるBar()
でしょうか、それとも時間を無駄にしているのでしょうか?
c++ - ローカル静的変数を一度評価する静的メソッドを作成するには?
ローカル静的変数を持つ静的メソッドを持つクラスがあります。その変数を 1 回 (関数を初めて呼び出すとき) 計算/評価し、その後の呼び出しでは評価されないようにしたいと考えています。どうやってするか?これが私のクラスです:
編集:
迅速なご協力ありがとうございます。全員に+1。Tyler McHenry の回答を選択したのは、比較を必要とせず、純粋に静的な関数評価を行う必要があるためです。アロケーターにはこのコードが必要になるため、別の「if」を避ける方がよいでしょう。再度、感謝します!
編集:
gf の答えは、コンパイル時に割り当てを処理し、プログラムをスレッドセーフな頭痛と明示的な初期化から救うため、最良の答えであることが判明しました。ただし、前回のベストアンサーを尊重します。目盛りを変更する代わりに、ここでクレジットを与えます。助けてくれてありがとう!