Qualsiasi domanda da un PROFI a un SUPER PROFI - 1. - pagina 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);
     }
Questo è un metodo della classe di mappatura.
 
Zhunko:
È un metodo di una classe di mappatura.

E allora?

L'argomento del ridimensionamento della mappatura non è trattato.

 
Questo è quello che faccio.
 
Zhunko:
Questo è quello che faccio.

Cioè quando si apre una mappatura con lo stesso nome e una dimensione diversa, cambia la dimensione?

Non devi rispondere, non è comunque nel codice. Quello che fai lì ha poco a che fare con la domanda :) quindi buona fortuna.

 

Certo che lo fa. Ho una libreria su questa classe che funziona. I test vanno bene. La prima variante di questa libreria è nel salvadanaio.

L'ultima versione della libreria stessa cambia dimensione a seconda delle necessità.

 
TheXpert:

Quindi quando si apre una mappatura con lo stesso nome e una dimensione diversa, cambia dimensione?

Non devi rispondere, non è quello che c'è nel codice comunque. Quello che fai lì ha poco a che fare con la domanda :) quindi buona fortuna.

Andrew, ho ricontrollato in due modi.

Beh, sì. Quando chiamate CreateFileMapping con lo stesso nome ma con una dimensione maggiore, la memoria viene espansa.
La cosa principale è che il primo handle di CreateFileMapping non dovrebbe essere chiuso (solo per evitare di perdere i contenuti precedenti).


Ma nel secondo caso ho testato un'ipotesi più interessante.

Un CreateFileMapping viene creato con una dimensione iniziale (ad esempio 2 byte) e vi vengono scritti 4 byte. E si espande automaticamente!

Quindi non c'è bisogno di creare un secondo handle CreateFileMapping con una dimensione maggiore.

Credo che la questione sia chiusa.
 
sergeev:

Ma il secondo caso ha testato l'ipotesi in modo più interessante.

CreateFileMapping viene creato con una dimensione iniziale (ad esempio 2 byte) e vi vengono scritti 4 byte. E si espande automaticamente!

Quindi non c'è bisogno di creare un secondo handle CreateFileMapping con dimensioni maggiori.

Credo che la questione sia chiusa.
È nella descrizione. È comodo, ma aumenta solo di dimensioni. Occupa risorse. Dovete creare il vostro gestore di memoria.
 
Zhunko:
È nella descrizione.

Nella descrizione di che cosa? È quello che mi serve per avere memoria.
 
sergeev:

Nella descrizione di cosa? Ho bisogno che sia liberato.

MSDN :-))

Cioè, se il consumo di memoria aumenta, bisogna provvedere al suo rilascio.

 
quando si chiude l'handle, la memoria (che è stata allocata oltre a quella specificata in CreateFileMapping) non viene restituita?
Motivazione: