Cualquier pregunta de un PROFI a un SUPER PROFI - 1. - página 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);
     }
Este es un método de la clase de mapeo.
 
Zhunko:
Es un método de una clase de mapeo.

¿Y qué?

No se trata el tema del cambio de tamaño de los mapas.

 
Eso es lo que hago.
 
Zhunko:
Eso es lo que hago.

Es decir, cuando se abre una cartografía con el mismo nombre y un tamaño diferente, ¿se cambia el tamaño?

No tienes que responder, de todas formas no está en el código. Lo que hagas ahí poco tiene que ver con la pregunta :) así que buena suerte.

 

Por supuesto que sí. Tengo una biblioteca en esta clase que funciona. Las pruebas están bien. La primera variante de esta biblioteca está en la hucha.

La última versión de la propia biblioteca cambia de tamaño en función de las necesidades.

 
TheXpert:

¿Así que cuando abres un mapa con el mismo nombre y un tamaño diferente cambia de tamaño?

No tienes que responder, eso no está en el código de todos modos. Lo que hagas allí tiene poco que ver con la pregunta :) así que buena suerte.

Andrew, he vuelto a comprobarlo de dos maneras.

Pues sí, al llamar a CreateFileMapping con el mismo nombre pero con un tamaño mayor, la memoria se expande.
Lo principal es que el primer handle de CreateFileMapping no debe ser cerrado (sólo para evitar perder el contenido anterior).


Pero, en el segundo caso, probé una hipótesis más interesante.

Se crea un CreateFileMapping con un tamaño inicial (por ejemplo, 2 bytes) y se escriben 4 bytes en él. Y se expande automáticamente.

Por lo tanto, no es necesario crear un segundo manejador CreateFileMapping con un tamaño mayor.

Creo que la pregunta está cerrada.
 
sergeev:

Pero el segundo caso puso a prueba la hipótesis de forma más interesante.

CreateFileMapping se crea con un tamaño inicial (por ejemplo, 2 bytes) y se le escriben 4 bytes. Y se expande automáticamente.

Por lo tanto, no es necesario crear un segundo manejador CreateFileMapping con un tamaño mayor.

Creo que la pregunta está cerrada.
Está en la descripción. Es útil, pero sólo aumenta de tamaño. Ocupa recursos. Tienes que hacer tu propio gestor de memoria.
 
Zhunko:
Está en la descripción.

¿En la descripción de qué? Eso es lo que necesito para que se me levante la memoria.
 
sergeev:

¿En la descripción de qué? Necesito que se libere.

MSDN :-))

Es decir, si el consumo de memoria aumenta, hay que prever su liberación.

 
cuando se cierra un handle, ¿no se revierte la memoria (que se ha asignado por encima de la especificada en CreateFileMapping)?
Razón de la queja: