C # статическая переменная класса (небезопасный указатель) не меняет значение - PullRequest
0 голосов
/ 30 мая 2019

Основная цель - быстрый анализ большого текстового файла с помощью команд ~ 10 ^ 9. Идея - скопировать файл в mem и получить указатель на это поле mem, используя класс MemoryMappedFile. И после этого просмотрите этот файл, используя этот указатель.

Запланированное заданное значение static byte* ptrExternal на AcquirePointer(ref ptrExternal) из LoadFile(string strFileNameInput). Но ptrExternal не изменил своего значения после вызова AcquirePointer(ref ptrExternal) (для тестирования я добавил дополнительные переменные и код)?

class MyMemmoryMappedFile
{
    private unsafe static byte* ptrExternal;
    private static int iptrExternal;  // for test purpose

    public static unsafe byte* LoadFile(string strFileNameInput)
        {
          ptrExternal = (byte*)0;
          byte* ptrLocal = (byte*)0;   // for test purpose
          mmf = MemoryMappedFile.CreateFromFile(strFileNameInput, FileMode.Open);
          AccessorViewAccessor = mmf.CreateViewAccessor();
          AccessorViewAccessor.SafeMemoryMappedViewHandle.AcquirePointer(ref ptrExternal);
          AccessorViewAccessor.SafeMemoryMappedViewHandle.AcquirePointer(ref ptrLocal);  // for test purpose
          ptrExternal = ptrLocal;  // for test purpose
          iptrExternal = (int)ptrLocal;  // for test purpose
          return ptrLocal;  // for test purpose
         }

За исключением вызова AcquirePointer(ref ptrExternal), который не изменил значение ptrExternal и ptrExternal = ptrLocal, который также не изменил значение ptrExternal, все работают должным образом: ptrLocal и iptrExternal получили правильные значения для "файл в памяти".

ptrExternal не изменял свои собственные значения и постоянно постоянно указывал на некоторую часть памяти, эта часть памяти очень похожа на программный код (начинается с байта b8 9a...).

Почему это не сработало, как я ожидал?

...