Qualquer pergunta de um PROFI para um 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 é um método da classe de mapeamento.
 
Zhunko:
É um método de uma classe de mapeamento.

E daí?

O tópico de redimensionamento de mapas não é abordado.

 
Isso é o que eu faço.
 
Zhunko:
Isso é o que eu faço.

Isto é, quando você abre um mapeamento com o mesmo nome e um tamanho diferente, ele muda de tamanho?

Você não precisa responder, de qualquer forma não está no código. O que você faz ali é pouco a ver com a pergunta :) então boa sorte.

 

É claro que sim. Eu tenho uma biblioteca sobre esta classe que funciona. Os testes são ótimos. A primeira variante desta biblioteca está no porquinho mealheiro.

A última versão da própria biblioteca muda de tamanho dependendo da necessidade.

 
TheXpert:

Então quando você abre um mapeamento com o mesmo nome e um tamanho diferente, ele muda de tamanho?

Você não precisa responder, não é isso que está no código de qualquer forma. O que você faz lá tem pouco a ver com a pergunta :) então boa sorte.

Andrew, eu verifiquei novamente de duas maneiras.

Bem, sim. Quando você chama o CreateFileMapping de CreateFileMapping com o mesmo nome, mas com um tamanho maior, a memória é expandida.
O principal é que o primeiro cabo do CreateFileMapping não deve ser fechado (apenas para evitar perder o conteúdo anterior).


Mas, no segundo caso, testei uma hipótese mais interessante.

Um CreateFileMapping é criado com um tamanho inicial (por exemplo, 2 bytes) e 4 bytes são escritos a ele. E ele se expande automaticamente!

Portanto, não há necessidade de criar um segundo cabo CreateFileMapping com um tamanho maior.

Acho que a questão está encerrada.
 
sergeev:

Mas! o segundo caso testou a hipótese de forma mais interessante.

CreateFileMapping é criado com um tamanho inicial (por exemplo, 2 bytes) e 4 bytes são escritos a ele. E ele se expande automaticamente!

Portanto, não há necessidade de criar um segundo cabo CreateFileMapping com tamanho maior.

Acho que a questão está encerrada.
Está na descrição. É útil, mas só aumenta de tamanho. Capta recursos. Você tem que fazer seu próprio gerente de memória.
 
Zhunko:
Está na descrição.

Na descrição de quê? É isso que preciso para despertar minha memória.
 
sergeev:

Na descrição do quê? Preciso que ele seja liberado.

MSDN :-))

Se o consumo de memória aumenta, você tem que liberá-lo.

 
ao fechar a alça, a memória (que foi alocada além da especificada no CreateFileMapping) não será revertida?
Razão: