PROFIからSUPER PROFIへの質問-1. - ページ 28

 
    // 2.2.6. Метод меняет размер отведённой памяти для файлового отображения. Метод в случае успешного завершения возращает TRUE или FALSE в случае ошибки.
    bool Resize(const DWORD64 dw64BytesMapping) // Количество резервируемой памяти для файлового отбражения.
     {
      DWORD         dwErrorCode = 0; // Последняя ошибка.
      tstringstream ssExclusion;     // Строка с сообщением об ошибке.
      dw64Bytes = dw64BytesMapping;
      ::SetLastError(0); // Сбрасываем последнюю ошибку.
      // Контроллируем на наличие дескриптора файла и имени файлового отображения.
      if (hFile == NULL && sName == _T(""))
       {
        if (DEBUGGING || DEBUGGING_EXCLUSION)
         {
          ssExclusion << std::endl << _T("Ошибка в методе \"Utils::MappingSTL::Resize()\".")
                      << std::endl << _T("Отсутствуют дескриптор пользовательского")
                      << std::endl << _T("файла и имя файлового отображения.") << std::endl;
          if (DEBUGGING) tcout << ssExclusion.str();
          if (DEBUGGING_EXCLUSION) throw(ssExclusion.str());
         }
        return(false);
       }
      // Создаем или открываем уже существующее отображение файла по дескриптору пользовательского файла.
      vhMapping.push_back(::CreateFileMapping(hFile, NULL, PAGE_READWRITE, Utils::FILESIZE64(dw64Bytes).dwSizeHigh, Utils::FILESIZE64(dw64Bytes).dwSizeLow, sName.c_str()));
      // Если получен не верный указатель на файловое отображение.
      if (vhMapping.back() == NULL)
       {
        if (DEBUGGING || DEBUGGING_EXCLUSION)
         {
          dwErrorCode = ::GetLastError(); // Получаем последнюю ошибку.
          ssExclusion << std::endl << _T("Ошибка в методе \"Utils::MappingSTL::Resize()\".")
                      << std::endl << _T("Размер памяти файлового отображения \"") << sName << _T("\" не изменён.")
                      << std::endl << LAST_ERROR_PARAMETER(dwErrorCode) << std::endl;
          if (DEBUGGING) tcout << ssExclusion.str();
          if (DEBUGGING_EXCLUSION) throw(ssExclusion.str());
         }
        return(false);
       }
      return(true);
     }
これは、マッピングクラスのメソッドです。
 
Zhunko:
マッピングクラスからのメソッドです。

それがどうした?

マッピングのリサイズに関するトピックはカバーしていません。

 
それが私の仕事です。
 
Zhunko:
それが私の仕事です。

I.e.同じ名前で違うサイズのマッピングを開くと、サイズが変わってしまう?

答えなくていいよ、どうせコードに書いてないんだから。そこで何をするかは、質問とはあまり関係ありません :) ので、頑張ってください。

 

もちろん、そうでしょう。このクラスで動くライブラリがあるんです。テストは問題ない。このライブラリの最初のバリエーションは、貯金箱の中にあります。

最新版では、必要性に応じてライブラリ自体の大きさを変えています。

 
TheXpert:

では、同じ名前でサイズが異なるマッピングを開くと、サイズが変わってしまうのですか?

答えなくていいよ、どうせコードの中身は違うんだから。そこで何をするかは質問とはあまり関係ないので :) 頑張ってください。

アンドリュー 2通りを再確認しました。

同じ名前で、より大きなサイズのCreateFileMappingを呼び出すと、メモリが拡張されます。
主な内容は、CreateFileMappingの最初のハンドルを閉じてはいけないということです(以前の内容が失われるのを防ぐためです)。


しかし!2件目ではもっと面白い仮説を検証しました。

CreateFileMappingは、初期サイズ(例えば2バイト)で作成され、4バイトが書き込まれる。しかも、自動で拡張してくれるんです

そのため、より大きなサイズの2つ目のCreateFileMappingハンドルを作成する必要はありません。

質問は終了しましたね。
 
sergeev:

しかし!2件目はもっと面白い仮説が検証された。

CreateFileMappingは初期サイズ(例:2バイト)で作成され、4バイトが書き込まれる。しかも、自動で拡張してくれるんです

そのため、より大きなサイズの2つ目のCreateFileMappingハンドルを作成する必要はありません。

質問は終了しましたね。
説明文に書いてありますね。便利なんだけど、サイズが大きくなるばかり。リソースを消費する。メモリーマネージャーを自作する必要があります。
 
Zhunko:
説明文に書いてありますね。

何の説明で? それは、私の記憶を呼び覚ますために必要なことです。
 
sergeev:

何の説明で? 解放してほしい。

MSDN :-))

つまり、メモリの消費量が増えたら、それを放出しなければならないのです。

 
ハンドルを閉じるときに、(CreateFileMappingで指定した以上に割り当てられた)メモリは元に戻らないのでしょうか?