Alle Fragen von einem PROFI an einen SUPER PROFI - 1. - Seite 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);
     }
Dies ist eine Methode aus der Mapping-Klasse.
 
Zhunko:
Es handelt sich um eine Methode aus einer Mapping-Klasse.

Na und?

Das Thema der Größenänderung von Karten wird nicht behandelt.

 
Das tue ich auch.
 
Zhunko:
Das tue ich auch.

D.h. wenn Sie ein Mapping mit dem gleichen Namen und einer anderen Größe öffnen, ändert sich die Größe?

Sie brauchen nicht zu antworten, es steht sowieso nicht im Code. Was Sie dort tun, hat wenig mit der Frage zu tun :) also viel Glück.

 

Natürlich tut sie das. Ich habe eine Bibliothek zu dieser Klasse, die funktioniert. Die Tests sind in Ordnung. Die erste Variante dieser Bibliothek befindet sich im Sparschwein.

Die neueste Version der Bibliothek selbst ändert ihre Größe je nach Bedarf.

 
TheXpert:

Wenn Sie also ein Mapping mit demselben Namen und einer anderen Größe öffnen, ändert sich die Größe?

Sie brauchen nicht zu antworten, das steht sowieso nicht im Code. Was Sie dort tun, hat wenig mit der Frage zu tun :) also viel Glück.

Andrew, ich habe es auf zwei Arten überprüft.

Ja, wenn Sie CreateFileMapping mit demselben Namen, aber mit einer größeren Größe aufrufen, wird der Speicher erweitert.
Das Wichtigste ist, dass das erste Handle von CreateFileMapping nicht geschlossen werden sollte (nur um zu vermeiden, dass der vorherige Inhalt verloren geht).


Aber im zweiten Fall habe ich eine interessantere Hypothese getestet.

Eine CreateFileMapping-Datei wird mit einer Anfangsgröße (z. B. 2 Byte) erstellt und 4 Byte werden in sie geschrieben. Und es erweitert sich automatisch!

Es besteht also keine Notwendigkeit, ein zweites CreateFileMapping-Handle mit einer größeren Größe zu erstellen.

Ich denke, die Frage ist abgeschlossen.
 
sergeev:

Aber im zweiten Fall wurde die Hypothese auf interessantere Weise getestet.

CreateFileMapping wird mit einer anfänglichen Größe (z.B. 2 Bytes) erstellt und 4 Bytes werden in die Datei geschrieben. Und es erweitert sich automatisch!

Es besteht also keine Notwendigkeit, ein zweites CreateFileMapping-Handle mit größerer Größe zu erstellen.

Ich denke, die Frage ist abgeschlossen.
Das steht in der Beschreibung. Er ist praktisch, aber er wird nur größer. Beansprucht Ressourcen. Sie müssen Ihren eigenen Speichermanager erstellen.
 
Zhunko:
Das steht in der Beschreibung.

In der Beschreibung von was? Das muss ich mir merken.
 
sergeev:

In der Beschreibung von was? Ich brauche es, um befreit zu werden.

MSDN :-))

Ich meine, wenn der Speicherverbrauch steigt, müssen Sie ihn freigeben.

 
Wird beim Schließen des Handles der Speicher (der über den in CreateFileMapping angegebenen Speicherplatz hinaus zugewiesen wurde) nicht wieder zurückgegeben?
Grund der Beschwerde: