ランタイムライブラリの互換性
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2021/08/13 22:03 UTC 版)
「Microsoft Visual C++」の記事における「ランタイムライブラリの互換性」の解説
Visual C++ (以下VC) のCRT (C Runtime) ライブラリは、コンパイルオプションによって静的リンクあるいは動的リンクを選択することができる。DLLおよびEXEにVCランタイムを動的リンクする場合、DLL/EXE自体のファイルサイズを削減できるなどのメリットがあるが、アプリケーションの実行にはVCバージョンごとのランタイムライブラリモジュールが実行環境に必要となる(例えばVC2010の場合は msvcr100.dll や msvcp100.dll など)。MFC/CLR/OpenMP/C++ AMPを利用して作成されたDLL/EXEの場合はさらにそれぞれのランタイムライブラリが必要となる。エンドユーザー環境向けにVCランタイムライブラリの再頒布可能 (redistributable) パッケージがインストーラー形式で提供されているが、このインストーラーにはデバッグバージョンのライブラリは含まれない。Windowsのバージョンによっては、特定のバージョンのVCランタイムのサブセットがシステムコンポーネントとしてプリインストールされている。 VCのランタイムライブラリは、バージョンごとにCRTオブジェクトのメモリ管理がなされていた。そのため、異なるバージョンのVC間でDLL境界を越えてCRTオブジェクトの寿命を管理することはできなかった。例えば古いバージョンのVCで作成されたDLL内でmalloc/newしたオブジェクトを、新しいバージョンのVCで作成されたアプリケーションでfree/deleteしたり、逆に新しいVCで作成されたDLL内でmalloc/newしたオブジェクトを、古いVCで作成されたアプリケーションでfree/deleteしたりすることは、ヒープ破壊などの実行時エラーや未定義動作を招く原因となる。メモリの確保と解放はモジュールごとに閉じていなければならず、モジュール外に確保と解放の処理を公開するためにはDLL関数によるラッピングが必要となる。 VC2015ではUniversal CRTが導入され、またVC2017およびVC2019ではランタイムに破壊的変更がなくVC2015との互換性があるため、一定の条件が満たされればDLL境界を越えてCRTオブジェクトの寿命を管理することができる。Windows 10の場合、Universal CRTはシステムコンポーネントとして標準インストールされているが、それよりも前のバージョンのWindowsではWindows Updateや再頒布可能パッケージによるシステムディレクトリへのインストール(集中配置)、あるいはアプリケーションごとのローカル配置などの手段を利用する必要がある。 「Microsoft Foundation Class」も参照
※この「ランタイムライブラリの互換性」の解説は、「Microsoft Visual C++」の解説の一部です。
「ランタイムライブラリの互換性」を含む「Microsoft Visual C++」の記事については、「Microsoft Visual C++」の概要を参照ください。
- ランタイムライブラリの互換性のページへのリンク