Организация кода инициализации - PullRequest
0 голосов
/ 26 мая 2018

Добрый день,

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

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

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

У меня есть файлы cpp для каждой реализации операционной системы.например sbrk для linux и HeapAlloc для windows.

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

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

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

//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);
}

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

1 Ответ

0 голосов
/ 26 мая 2018

Вам не нужно использовать HeapCreate(), чтобы использовать HeapAlloc() / HeapFree(), вы можете просто использовать 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);
}
...