Oberon space
General Category => Общий раздел => Тема начата: Jordan от Февраль 22, 2019, 03:24:33 pm
-
Приветствую!
Решил написать минимальное приложение на winapi.
Стал реализовывать работу с памятью через winapi.
Программа падает.
Как компилю.(использую mingw)
"..\..\mingw\bin\g++" -omain -s -nostdlib -fno-rtti -fno-exceptions -fno-use-cxa-atexit -Wall -Wformat -Werror main.cpp -lkernel32 -luser32
сам исходник
#include <windows.h>
class Memory
{
private:
HANDLE Heap;
public:
Memory()
{
Heap = HeapCreate(0,0x01000,0);
}
void * Allocate(unsigned int Size)
{
return HeapAlloc(Heap, 0, Size);
}
void Deallocate(void * Src)
{
HeapFree(Heap, 0, Src);
}
~Memory()
{
HeapDestroy(Heap);
}
};
static Memory GlobalMemoryAllocator;
void * operator new(unsigned int Size)
{
return GlobalMemoryAllocator.Allocate(Size);
}
void operator delete(void * Src)
{
GlobalMemoryAllocator.Deallocate(Src);
}
class Mem
{
public:
int m_Data;
};
void Main()
{
Mem * p = new Mem;
p->m_Data = 5;
if (p->m_Data > 10)
{
p->m_Data = 100;
}
MessageBox(0, "Hello!", "MsgBox", 0);
//Console Out;
//Out.Write("Hello World!");
ExitProcess(0);
}
-
Нагуглил, сделал проверку оп ассерту, один фиг не работает.
#include <windows.h>
#define Assert(Expression) \
do { \
if(!(Expression)) \
{ \
MessageBox(0, "#Expression", "Assert", 0); \
ExitProcess(0); \
} \
} while(0)
#define NULL 0
class Memory
{
private:
HANDLE Heap;
public:
Memory()
{
}
void * Allocate(unsigned int Size)
{
void * p = NULL;
p = VirtualAlloc(NULL, Size, MEM_RESERVE, PAGE_READWRITE);
Assert(p != NULL);
return p;
}
void Deallocate(void * Src)
{
Assert(Src != NULL);
VirtualFree(Src, 0, MEM_RELEASE);
}
~Memory()
{
HeapDestroy(Heap);
}
};
Memory GMAllocator;
/*void * operator new(unsigned int Size)
{
void * p = GMAllocator.Allocate(Size);
return p;
}*/
/*void operator delete(void * Src)
{
GMAllocator.Deallocate(Src);
}*/
class Mem
{
public:
int m_Data;
};
Mem idl;
void Main()
{
Mem * p = (Mem*)GMAllocator.Allocate(sizeof(Mem));
p->m_Data = 5;
if (p->m_Data > 10)
{
p->m_Data = 100;
}
MessageBox(0, "Hello!", "MsgBox", 0);
//Console Out;
//Out.Write("Hello World!");
ExitProcess(0);
}
-
На гитхабе посмотрел реализацию msvcrt, как реализован malloc
void* malloc(size_t _size)
{
return HeapAlloc(hHeap, HEAP_ZERO_MEMORY, _size);
}
В dllmain при загрузке данной либы
hHeap = HeapCreate(0, 100000, 0);
if (hHeap == NULL)
return FALSE;
Ну ладно думаю, сделаю аналогично.
#include <windows.h>
#define S1(x) #x
#define S2(x) S1(x)
#define _Assert(Expression, File, Line) \
do { \
if(!(Expression)) \
{ \
MessageBox(0, S2(Line), "", 0); \
ExitProcess(0); \
} \
} while(0)
#define Assert(X) _Assert(X, __FILE__, __LINE__)
#define NULL 0
class Memory
{
private:
HANDLE Heap;
public:
Memory()
{
Heap = NULL;
Heap = HeapCreate(0, 100000, 0);
Assert(Heap != NULL);
}
void * Allocate(unsigned int Size)
{
void * p = NULL;
p = HeapAlloc(Heap, HEAP_ZERO_MEMORY, Size);
Assert(p != NULL);
return p;
}
void Deallocate(void * Src)
{
Assert(Src != NULL);
HeapFree(Heap, 0, Src);
}
};
Memory GlobalMemoryAllocator;
void * operator new(unsigned int Size)
{
void * p = GlobalMemoryAllocator.Allocate(Size);
return p;
}
void operator delete(void * Src)
{
GlobalMemoryAllocator.Deallocate(Src);
}
class Mem
{
public:
int m_Data;
};
Mem idl;
void Main()
{
Mem * p = new Mem;
p->m_Data = 5;
if (p->m_Data > 10)
{
p->m_Data = 100;
}
MessageBox(0, "Hello!", "MsgBox", 0);
//Console Out;
//Out.Write("Hello World!");
ExitProcess(0);
}
Все равно не работает. Ассерты не срабатывают.
-
Пока был на уровне STL все шло нормально. Но мне захотелось посмотреть как оно всё под капотоп то работает.