Автор Тема: Закат солнца вручную!  (Прочитано 15603 раз)

Jordan

  • Sr. Member
  • ****
  • Сообщений: 282
    • Просмотр профиля
Закат солнца вручную!
« : Февраль 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);
}

Jordan

  • Sr. Member
  • ****
  • Сообщений: 282
    • Просмотр профиля
Re: Закат солнца вручную!
« Ответ #1 : Февраль 22, 2019, 05:05:27 pm »
Нагуглил, сделал проверку оп ассерту, один фиг не работает.

Цитировать
#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);
}

Jordan

  • Sr. Member
  • ****
  • Сообщений: 282
    • Просмотр профиля
Re: Закат солнца вручную!
« Ответ #2 : Февраль 22, 2019, 05:44:10 pm »
На гитхабе посмотрел реализацию 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);
}

Все равно не работает. Ассерты не срабатывают.

Jordan

  • Sr. Member
  • ****
  • Сообщений: 282
    • Просмотр профиля
Re: Закат солнца вручную!
« Ответ #3 : Февраль 22, 2019, 05:46:21 pm »
Пока был на уровне STL все шло нормально. Но мне захотелось посмотреть как оно всё под капотоп то работает.