問題タブ [static-initializer]
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++ - .crt セクション? この警告はどういう意味ですか?
最近、この警告が表示されました (VC++ 2010)
warning LNK4210: .CRT section exists; there may be unhandled static initializers or terminators
これがクリティカルセクションだと思います。オペレーティング システムのコースを受講してからしばらく経ちましたが、これが何を意味するのかよくわかりません。私の記憶が正しければ、クリティカル セクションは共有リソースで機能します。では、この警告はどのように関連しており、正確には何を意味するのでしょうか?
c++ - 静的メンバーの初期化でnew()を回避しますか?
問題のコードは次のとおりです。
ヘッダ:
実装:
これらのnew()演算子を使用せずに、新しいヘルパー変数を追加しない方法はありますか?
プログラムの他の部分と互換性を持たせるには、型はそのままである必要があります。
編集:答えから推測すると、ヘルパー変数が使用されていない場合は、new()を使用する必要があります。それは本当ですか?したがって、ヘルパー変数を追加する場合があります。これはとにかくコンパイラによって生成されたコードなので、ヘッダーが読み取り可能である限り問題ありません。
次は大丈夫でしょうか?現在、Valgrindはリークはないと言っています。
android - Androidでのグローバル初期化
開発者が使用する前にアプリケーションIDで初期化する必要があるjarファイルとして配布されているライブラリコードを書いています。初期化は、次のような単なる関数呼び出しです。
トリッキーなことは、この初期化呼び出しを行うように開発者に指示する方法がわからないことです。最初は、メインアクティビティの単一の静的初期化ブロックが最も簡単な方法だと思いました。問題は、ユーザーが他のアクティビティまたはインテントを介してアプリケーションに入る可能性があり、メインアクティビティが読み込まれないことです。アプリケーションの起動方法に関係なく、アプリケーションの起動時にコード行が実行されるようにする一般的な方法はありますか?
初期化呼び出しはべき等であるため、使用できるすべての場所でこの初期化呼び出しを行うように人々に指示することができますが、それは面倒です。
java - 静的初期化ブロックでスレッドが作成されると、プログラムがハングします
プログラムがハングし、デッドロックのように見える状況に遭遇しました。しかし、jconsoleとvisualvmを使用してそれを理解しようとしましたが、デッドロックは検出されませんでした。サンプルコード:
これをデバッグモードで実行すると、コントロールが@Override public void run(){state = 11;
ただし、state = 11が実行されるとすぐに、ハング/デッドロックが発生します。私はstackoverflowのさまざまな投稿を調べ、静的初期化子はスレッドセーフだと思いましたが、その場合、jconsoleはこれを報告する必要があります。メインスレッドについて、jconsoleは待機状態にあると言っていますが、それで問題ありません。ただし、静的初期化子ブロックで作成されたスレッドの場合、jconsoleは、スレッドがRUNNABLE状態であり、ブロックされていないと言います。私は混乱していて、ここではいくつかの概念が欠けています。私を助けてください。
c# - C# のコレクション初期化子
Java では、List を作成し、静的初期化子を使用してすぐに入力できます。このようなもの:
その場でリストを作成し、それを引数として関数に渡すことができるので、これは便利です。このようなもの:
私はC#が初めてで、これを行う方法を理解しようとしていますが、空になります。これはC#で可能ですか? もしそうなら、どうすればそれを行うことができますか?
c++ - C++ でクラスの静的配列メンバーを初期化するより良い方法 ( const が優先されます)
クラスのメンバーとして、関数へのポインターの静的配列があります。
初期化する必要がありますが、この配列は 64K アイテムの長さであることが判明したため、静的イニシャライザーで初期化することは、{ x, y, z, ... }
コードが乱雑になるため現実的ではありません。
代わりに、いくつかのループを使用してコードで初期化する必要があります。
私がこれを行う方法は、コンストラクターで配列を初期化し、static
それにフラグを設定することです。そのため、クラスの最初のインスタンスの構築のみがこの初期化を起動します。
また、インスタンス内からこの静的フラグにアクセスすることはスレッドセーフではありませんが、それは別の話です。
これを行うためのよりクリーンまたはより良い方法はありますか?
私もこの配列を にしたいのですがconst
、それを行う唯一の方法はstatic {}
初期化ですよね?
c++ - ライブラリ内のすべての動的初期化を検索する
ダイナミックライブラリにコンパイルするいくつかの大きなコードベースがあります。これらのいくつかには、非常に高価な動的グローバル動的初期化子があることを私は知っています。(つまり、構築に非常にコストがかかるクラス/構造体のグローバルインスタンスです。)
これらの動的初期化子がコード内の何/どこにあるかのリストを表示して、それらが高価でリファクタリングが必要かどうかを確認する方法が必要です。これらのライブラリのいくつかは非常に大きく、おそらく何百もの動的初期化子を含んでいるので、多くのアセンブリを掘り下げることは避けたいと思います(それらの多くは文字列構造のように小さくてかなり安価です)。
これを支援するツールはありますか?(私のツールチェーンはRedhat Linux / gcc / cmakeです。)
java - Sun の JVM で遅延クラスのロード/初期化を無効にするにはどうすればよいですか?
デフォルトでは、Sun の JVM は、クラスを遅延ロードし、遅延初期化 (つまり、それらの<clinit>
メソッドを呼び出す) の両方を行います。ブロック中にClinitBomb
をスローする次のクラスを考えてみましょう。Exception
static{}
ここで、爆弾をトリガーする方法を検討してください。
forName
のドキュメントにそう書かれているので、点 B の前に爆発が起こることが保証されています。問題は、ポイント A の前 ( がロードされるとき) に発生するかどうかMain
です。Sun の JVM では、main()
への静的参照が含まれていても、ポイント A のClinitBomb
後に発生します。
JVM が初期化ClinitBomb
されるとすぐにロードして初期化するように指示する方法が必要です (したがって、爆弾はポイント Aの前Main
で爆発します)。クラス Y 参照します。」
それを行う方法はありますか?
c++ - 組み込み型のオブジェクトには、特別な静的初期化順序の優先順位がありますか?
次のコードでセグメンテーション違反(またはUB)が発生すると予想していました。
これは、がのt
前に初期化されるためですstr
。初期化がゼロであるためstr
、値を保持することを期待します。(char const*)0
私の解釈は[C++11: 3.6.2/2]
これをサポートしています。
ただし、上記のスニペットは期待どおりに文字列を出力しているように見えます(そして、ポインターの値も出力することで動作を確認しました)。
ここで欠落している静的初期化のルールがありますか?これにより、構築を開始str
する前に値を初期化できますか?t
標準のどこにありますか?
これは、ビルド時の静的変数の解決でchar const*
発生しました。回答者は、静的グローバルではなくを使用するとstd::string
、静的初期化順序の失敗を回避できると主張しました。同意しませんでしたが、今はよくわかりません...
java - Java: Locale オブジェクトの構築時に NullPointerException が原因で ExceptionInInitializerError が発生する
私は他の数人と一緒に書いたプログラムのローカリゼーションに取り組んでいます。ほとんどの文字列が、ini ファイルから適切な言語で読み込まれるようになりました。プログラムの通貨の形式についても同じことをしようとしています。ただし、アプリケーションを起動しようとするとすぐに実行時例外が発生します。
次のように、 Locale オブジェクトをいくつかの NumberFormat.getCurrencyInstance() のパラメーターとして使用しています。
Lang は、すべてのローカリゼーションを含むクラスです。試行された実行時に IDE が不平を言うコードは次のとおりです。public static Locale cLocale = new Locale(GUI.DB_info[19],GUI.DB_info[20]);
GUI は、GUI が含まれているクラスであり、DB_info 配列を構築することにした場所です (それ自体は、別のクラスのリモート データベースからロードされた情報を含むだけです)。DB_info[19] は言語コード (現在の es) で、DB_info[20] は国コード (US) です。配列の要素は適切に埋められています。または、今はプログラムを十分に理解することができません。しかし、DB_info を埋めるためのコードは何も変わっていません。
完全な例外は次のとおりです。
参照されている GUI の行は:static String welcome = Lang.L_WELCOME + ", " + empName;
であり、Lang.java は基本的に次のようになります。
これは、文字列の大部分が異なる言語で表示されるためです。Lang 内には、最初のセットとは関係なく、他の文字列をロードする別のメソッドがあります。この問題の要因になるとは思いませんが、必要に応じて投稿できます。
これらのクラス/メソッドが起動される順序は次のとおりです。 GUI.Main が Login クラスを呼び出し、Login クラスが CreateLogin メソッドを呼び出します。このメソッドは Clients.main を呼び出し、渡された GUI から DB_info 配列を取得します。クライアントは DB_info 配列を埋めます。次に Lang.other が呼び出され (ログイン ページの言語固有の文字列を取得するため)、ログイン ボタンとラベルが作成されます。ログインが成功すると、(DB から) ログインしている従業員の優先言語が Lang.main に渡され、他の文字列が読み込まれます (したがって、上記のコードでは emp_lang が渡されます)。
Locale オブジェクトのコードを追加するまでは、すべて正常に機能していました。これで、ExceptionInInitializerError 例外が発生します。何が起こっているか知っている人はいますか?
ところで、ini ファイルからロードするために、私は ini4j を使用しています。グーグルで見つけたいくつかのフォーラム投稿は、これが問題であることを示唆していますが、Locale オブジェクトの問題とどのように関連しているかはわかりません。ini の機能は正常に動作します。