从专业人员到超级专业人员的任何问题 - 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:
这就是我的工作。

也就是说,当你打开一个具有相同名称和不同尺寸的映射时,它就会改变尺寸?

你不需要回答,反正代码里没有这一条。你在那里做什么与这个问题关系不大 :) 所以祝你好运。

 

当然是这样。我有一个关于这个类的库,可以使用。测试很好。这个库的第一个变体是在猪圈。

最新版本的库本身根据需要改变大小。

 
TheXpert:

因此,当你打开一个具有相同名称和不同尺寸的映射时,它就会改变尺寸?

你不需要回答,反正代码里没有这个内容。你在那里做什么与这个问题关系不大 :) 所以祝你好运。

安德鲁,我重新检查了两种方式。

嗯,是的。 当你用相同的名字但用更大的尺寸调用CreateFileMapping时,内存会被扩展。
最主要的是,CreateFileMapping的第一个句柄不应该被关闭(只是为了避免丢失之前的内容)。


但是!在第二种情况下,我测试了一个更有趣的假说。

一个CreateFileMapping被创建,有一个初始大小(例如2字节),4个字节被写入它。而且,它还会自动扩展自己!

所以没有必要创建第二个具有更大尺寸的CreateFileMapping句柄。

我认为这个问题已经结束。
 
sergeev:

但是!第二个案例更有趣地检验了这个假设。

CreateFileMapping的创建有一个初始大小(例如2个字节),4个字节被写入它。而且,它还会自动扩展自己!

所以没有必要创建第二个具有更大尺寸的CreateFileMapping句柄。

我认为这个问题已经结束。
这是在描述中。这很方便,但它只会增加尺寸。占用了资源。你必须制作你自己的内存管理器。
 
Zhunko:
这是在描述中。

在描述什么? 这就是我需要的,让我的记忆力提高。
 
sergeev:

在描述什么? 我需要它被释放。

MSDN :-))

我的意思是,如果内存消耗增加,你必须释放它。

 
当关闭句柄时,内存(已经分配了超过CreateFileMapping中指定的内存)是不是不会再恢复了?