Должен ли я использовать ReAllocHGlobal или FreeHGlobal / AllocHGlobal? - PullRequest
2 голосов
/ 13 марта 2009

Устаревшая база данных, с которой я взаимодействую, использует буфер данных для передачи строк в приложения. Чтобы справиться с этим в C #, я написал класс, который предоставляет методы для чтения и записи различных типов в буфере. Каждый файл данных использует один буфер данных, но размер буфера должен быть изменен для определенных операций. Для этого я добавил метод Allocate :

public void Allocate(int bytes) {
    if (handle != IntPtr.Zero) { // memory has already been allocated
        Marshal.FreeHGlobal(handle);
    }
    handle = Marshal.AllocHGlobal(bytes);
}

Это было до того, как я заметил ReAllocHGlobal , однако. Теперь мне интересно, если я должен сделать это:

public void Allocate(int bytes) {
    if (handle != IntPtr.Zero) { // memory has already been allocated
        handle = Marshal.ReAllocHGlobal(handle, (IntPtr)bytes);
    } else { // this is a brand new data buffer
        handle = Marshal.AllocHGlobal(bytes);
    }
}

Я думаю, что первый метод выглядит чище, но какой лучше использовать? Моей первой мыслью было, что ReAllocHGlobal имеет наибольшее значение (поскольку оно специально для изменения размера существующего блока памяти), но я не уверен на 100%.

1 Ответ

4 голосов
/ 13 марта 2009

Если вам не нужно сохранять информацию в буфере, освобождение и выделение нового буфера является лучшим вариантом. Если ReAlloc нужно выделить буфер в другом месте, он скопирует существующее содержимое.

С другой стороны, если вы хотите сохранить содержимое буфера и расширить (или сжать) его, ReAlloc - более простой подход.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...