問題タブ [crt]
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++ - DLLのアンロード時にメモリリークが発生すると、ホストプロセスにリークが発生しますか?
この場合を考えてみましょう:
この時点で、malloc()の呼び出しで割り当てられた1kは、ホストプロセスで再び使用できるようになりますか?DLLはCRTに静的にリンクしています。
multithreading - _nolock CRT 関数
最近_nolock 関数の存在を発見しましたが、これらに関する情報がほとんどないことに驚いています。パフォーマンスが向上すると書かれていますが、ベンチマークが見つかりません。また、プログラムが独自のロックを行う場合、マルチスレッドプログラムで使用できるとも書かれていますが、何をロックする必要がありますか? すべての CRT 呼び出しが同じロックを通過する必要がありますか? 関数ごとに1つ?関数のグループごとに 1 つですか? もしそうなら、グループを定義するものは何ですか?
これらの機能に関する詳細情報を教えていただけますか? ありがとう :-)
c - 初心者の scanf_s() 障害
scanf_s() に奇妙な点があることは知っていますが、問題を解決できませんでした。私のコードは scanf() を使用してうまく機能しますが、これは配列の要素を逆にしません:(
c - WinMain を使用せずに Windows アプリケーションを作成するにはどうすればよいですか?
C/C++ で記述された Windows GUI アプリケーションには、(「main」ではなく) エントリ ポイントとして「WinMain」があります。これについての私の理解は、コンパイラが C ランタイムによって呼び出される「メイン」関数を生成するということです。この「main」関数は、GUI に必要な環境をセットアップし、「WinMain」を呼び出します (インスタンス ハンドルなどを指定します)。
要するに、コンソールと GUI アプリケーションの起動は次のように異なると思います。
コンソール アプリケーション: C ランタイム --> 'main' 関数 (ハンドコーディング)
GUI アプリケーション: C ランタイム --> 'main' 関数 (コンパイラ生成) --> 'WinMain' 関数 (ハンドコーディング)
この理解を検証し、「メイン」関数だけで (つまり、「WinMain」を記述する必要なく) Windows GUI をハンドコーディングする方法を見つけたいと思います。
visual-c++ - VC90 デバッグ CRT エラー
VC++ 2008 で Dll を作成しましたが、他のソフトウェア (VB) で動作しています。Labview でその dll 関数をロードできません。VC90 デバッグ CRT エラーが発生しています。このソフトウェアが私の dll をサポートしていないのはなぜですか?
c++ - Visual Studio 2008 を使用し、Side-by-Side DLL を使用せずに、プレーンな古い XP SP2 で実行される C++ アプリをビルドするにはどうすればよいですか?
WinExec
いくつかのコマンド ライン パラメーターを使用して別の実行可能ファイルを起動するために、1 回の呼び出しで C++ プロジェクトをコンパイルしたいと考えています。Microsoft のサイド バイ サイド DLL を必要とせずに動作する実行可能ファイルを生成するために、プロジェクトで指定する設定がわかりません。これをターゲット システムにインストールする必要はありません。ヒントはありますか?
この症状は、アプリケーションの起動に失敗し、次のイベントがアプリケーション ログに書き込まれることです (フランス語から自由に翻訳されたものです)。
更新: 使用が悪い習慣であることは知っていWinExec
ますが、それは魔法のように機能し、Microsoft は API の将来のリリースでそれを削除することはできないのではないでしょうか?
c - VC で main() ルーチンに入る前にコードを実行する方法は?
私は Microsoft の CRT ソース コードを読んでおり、main() ルーチンの前に関数 __initstdio1 が実行される次のコードを思いつくことができます。
問題は、VC (VC++ コードではなく) で main() ルーチンに入る前にコードを実行する方法です。
出力は次のようになります。
ただし、コードを理解できません。
.CRT$XIC でいくつかのグーグルを実行しましたが、運がありません。専門家が上記のコード セグメント、特に以下について説明してくれませんか。
- この行
_CRTALLOC(".CRT$XIC") static pinit = __initstdio1;
はどういう意味ですか? 変数 pinit の意味は何ですか? - コンパイル中に、コンパイラ (cl.exe) は次のような警告をスローします。
Microsoft (R) 32 ビット C/C++ 最適化コンパイラ バージョン 15.00.30729.01 for 80x86 Copyright (C) Microsoft Corporation. 全著作権所有。
警告メッセージを削除するには、どのような修正アクションを実行する必要がありますか?
前もって感謝します。
追加した:
コードを変更し、_PIFV として pinit に型を指定しました。これで、警告メッセージはなくなりました。
新しいコードは次のとおりです。
c++ - /MD または /MT でコンパイルする必要がありますか?
Visual Studio には、必要な C ランタイム ライブラリの種類を選択できるコンパイル フラグ /MD および /MT があります。
実装の違いは理解できましたが、どちらを使用すればよいかまだわかりません。長所/短所は何ですか?
私が聞いた /MD の利点の 1 つは、これにより誰かがランタイムを更新できることであり (おそらくセキュリティ問題にパッチを当てるなど)、私のアプリはこの更新の恩恵を受けるでしょう。私には、これはほとんど非機能のように思えます: 新しいバージョンに対してテストすることを許可せずに、人々が私のランタイムを変更することを望んでいません!
私が興味を持っているいくつかのこと:
- これはビルド時間にどのように影響しますか? (おそらく /MT は少し遅いですか?)
- 他の意味は何ですか?
- 多くの人が使っているのはどれ?
msvcrt - Visual Studio Cランタイムに静的または動的にリンクする必要がありますか?
Visual StudioプロジェクトでCランタイムライブラリに静的にリンクするか動的にリンクするかについて、両側で議論を読みましたが、何を考えればよいのかまだ完全にはわかりません。
私のプロジェクトは、いくつかのサードパーティライブラリ(Python、HDF5、Trilinos、およびMicrosoft MPI)を取り込みます。これらのライブラリはそれぞれ、最終的な実行可能ファイルと同じランタイムライブラリでビルドする必要があります(そうでない場合、それらをリンクすることはできません)。静的にリンクする場合、これらの各ライブラリにはCランタイムのコピーが含まれます。最終的な実行可能ファイルにはランタイムの複数のコピーが含まれ、それらのいずれも相互に対話できないため、これにより問題が発生する可能性があることを読みました。しかし、同じシンボルが複数定義されている場合、リンカーは文句を言いませんか?
「DLLHell」は避けたいのですが、ランタイムの複数のコピーを静的にリンクすることで発生する可能性のある潜行性のエラーが心配です。私は物事を間違って読んでいますか?
また、Visual Studio 2005を使用していますが、ServicePack1ランタイムには下位互換性がないことを読みました。これは、SP1なしでビルドされたアプリは、同じ名前(msvcr80.dllなど)であっても、SP1 dllを持つマシンでは実行されないことを意味しますか?
windows - Windowsのmallocの置き換え(tcmallocなど)と動的なcrtリンク
複数のDLLとQTを使用するC++プログラムには、Windowsのmallocが原因であることが確認できるパフォーマンスの問題のために、mallocの置換( tcmallocなど)を装備する必要があります。Linuxの場合は問題ありませんが、Windowsの場合はいくつかのアプローチがあり、どれも魅力的ではありません。
1.新しいmallocをlibに入れ、最初にリンクするようにします(その他のSO-質問)
これには欠点があります。たとえば、strdupは古いmallocを引き続き使用し、freeはプログラムをクラッシュさせる可能性があります。
2. lib.exe(Chrome)を使用して静的libcrtライブラリからmallocを削除します
これはクロム/クロムについてテスト/使用(?)されていますが、crtの静的リンクでのみ機能するという欠点があります。静的リンクには、1つのシステムライブラリがmsvcrtに対して動的にリンクされている場合に問題があり、ヒープの割り当て/割り当て解除に不一致がある可能性があります。私が正しく理解していれば、tcmallocは動的にリンクされ、すべての自己コンパイルされたdllに共通のヒープが存在する可能性があります(これは良いことです)。
3.パッチcrt-ソースコード(firefox)
Firefoxのjemallocは、明らかにWindows CRTソースコードにパッチを適用し、新しいcrtを構築します。これにも、上記の静的/動的リンクの問題があります。
これを使用して動的MSVCRTを生成することも考えられますが、ライセンスでは同じ名前のパッチが適用されたMSVCRTを提供することが禁止されているため、これは不可能だと思います。
4.実行時にロードされたCRTに動的にパッチを適用します
一部の商用メモリアロケータは、そのような魔法を実行できます。tcmallocでも可能ですが、これはかなり醜いようです。いくつかの問題がありましたが、修正されました。現在、tcmallocでは、64ビットウィンドウでは機能しません。
より良いアプローチはありますか?コメントはありますか?