Организация кода инициализации

Добрый день,

Я работал над распределением памяти для портативного использования.

У меня есть файл заголовка, который содержит прототипы функций и перегрузки операторов для новых и удаленных.

void* mem_align16(size_t size);
void mem_delete16(void* memory);

Затем у меня есть файлы cpp для каждой реализации операционной системы. например sbrk для Linux и HeapAlloc для Windows.

при работе с окнами я должен использовать дескриптор для выделения памяти.

HANDLE heap_handle = HeapCreate(0, 0, 0);  

Как мне использовать ручку аккуратно и аккуратно? Поскольку дескриптор необходимо использовать при запуске внутри main. Единственный способ, которым я могу думать об использовании дескриптора, - это использовать его как статическую переменную внутри файла cpp, где используются функции, а затем использовать функцию для обновления статической переменной, а затем объявить ее вперед внутри main.cpp

//inside of win32_heap.cpp
static HANDLE heaphandle = 0;

void make_heap_handle(void) {
    heaphandle = HeapCreate(0, 0, 0);
}

//inside of win32_main.cpp
void make_heap_handle(void);
int main(int argc, char** argv) {
    make_heap_handle();
    return (0);
}

По какой-то причине это кажется неправильным, чтобы получить удобный дескриптор для использования с моими функциями.


person Brad    schedule 25.05.2018    source источник
comment
Что не так с возможностями стандартной библиотеки C ++ и компилятора, совместимого со стандартным C ++, для портативного использования?   -  person    schedule 26.05.2018
comment
Учитывая, что HANDLE зависит от системы, требовать, чтобы он был доступен main(), вряд ли переносимо. Организуйте свой код так, чтобы такие детали не были доступны за пределами ваших функций. Кроме того, ваш вопрос неясен. (Согласитесь также с комментарием Нила Баттерворта - нет смысла использовать собственное управление памятью, если вы ищете портативное решение).   -  person Peter    schedule 26.05.2018
comment
оператор new предлагает все, что вы просите (предположительно, не распределение распределения с конкретными требованиями выравнивания).   -  person IInspectable    schedule 26.05.2018
comment
@Peter Но HANDLE не подвергается воздействию main(), не так ли? Только make_heap_handle(), и для этого просто нужно более разумное имя, например (скажем) init_memory_manager().   -  person Paul Sanders    schedule 26.05.2018


Ответы (1)


Вам не нужно использовать HeapCreate(), чтобы использовать _2 _ / _ 3_, вместо этого вы можете просто использовать GetProcessHeap():

void* mem_align16(size_t size)
{
    // adjust size as needed...
    void *memory = HeapAlloc(GetProcessHeap(), 0, size);
    if (!memory) return nullptr;
    // adjust memory as needed ...
    return memory;
}

void mem_delete16(void* memory)
{
    // adjust memory as needed...
    HeapFree(GetProcessHeap(), 0, memory);
}

Однако, если вы действительно хотите создать свою собственную частную кучу, вы можете создать одноэлементный класс, скрытый внутри вашего win32_heap.cpp файла, для создания и уничтожения вашей частной кучи. Остальная часть вашего кода за пределами win32_heap.cpp не будет знать о его существовании:

class MyHeap
{
public:
    HANDLE hHeap;

    MyHeap() {
        hHeap = HeapCreate(0, 0, 0);
    }

    ~MyHeap() {
        HeapDestroy(hHeap);
    }
};

static MyHeap gMyHeap;

void* mem_align16(size_t size)
{
    // adjust size as needed...
    void *memory = HeapAlloc(gMyHeap.hHeap, 0, size);
    if (!memory) return 0;
    // adjust memory as needed ...
    return memory;
}

void mem_delete16(void* memory)
{
    // adjust memory as needed...
    HeapFree(gMyHeap.hHeap, 0, memory);
}
person Remy Lebeau    schedule 26.05.2018
comment
Или даже просто: static HANDLE gMyHeap = HeapCreate (...), поскольку нет необходимости уничтожать его при завершении программы. - person Paul Sanders; 26.05.2018