本ページは公開が終了した情報の複製であり、掲載時点での情報です。本ページに記載されている内容について各所に問い合わせることはご遠慮下さい。
サポート技術情報

[VC15] 仮想メモリ関数 _vmalloc の障害

文書番号: 127201

最終更新日: 2003/08/28


この資料は以下の製品について記述したものです。


この記事は、以前は次の ID で公開されていました: JP127201
1.50 1.51 1.52MS-DOSkbprg kbbuglist

概要

この資料は、_vmalloc 関数で同じサイズのメモリ ブロックを連続して割り当てる際に発生する障害について説明したものです。

詳細

_vmalloc 関数使用時、以下の条件を満たすと_vmalloc の実行に失敗します。
  • メモリ ブロックのサイズが 2042byte 以下 (ブロックアロケーション)。
  • 仮想メモリ マネージャを再初期化せずに、仮想メモリを再利用。
  • 少なくとも 1000 個以上のメモリ ブロック配列を割り当てる。

再現プログラム

  _vheapinit(...);

   // _vmalloc() fails on the second iteration when j=512.
   for ( i=0; i<2; i++ )
   {
     for ( j=0; j<1000; j++ )
       handle[j] = _vmalloc(...);

     for ( j=0; j<1000; j++ )
       _vfree( handle[j] );
   }

   _vheapterm();

解決方法

以下の方法のいずれかにより回避してください。
  • ブロックアロケーションでなく頁アロケーションにする。
    (確保するメモリ ブロックサイズを 2043byte 以上にする。) 仮想メモリ マネージャは 6byte のヘッダ情報を割り当てサイズに加え、結果を仮想メモリサイズ (2048byte) の次の倍数に切り上げます。
  • 仮想メモリの再割り当てが必要な場合、仮想メモリ マネージャを再初期化する。
        for ( i=0; i<2; i++ )
        {
          _vheapinit(...);
     
          for ( n=0; n<1000; n++ )
            handle[n] = _vmalloc(...);
     
          for ( n=0; n<1000; n++ )
            _vfree( handle[n] );
     
          _vheapterm();
        }
    

関連情報

  • Visual C++ は、米国 Microsoft Corporation の登録商標です。

Additional query words: 1.50 1.51 buglist8.00

Keywords: KBBUG VC10 VC15 KB127201
Technology: kbAudDeveloper kbVCsearch

inserted by FC2 system