[C++ WinAPI] Тупой вопрос про new и точку входа

Vladislav177Rus

Имеется код:
#include <windows.h>

int WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpszCmdLine, int nCmdShow){
char *Str;
int n=100;
Str = new char [n];
delete [] Str;
ExitProcess(0);
}
Работает. Добавляем #pragma comment(linker, "/ENTRY:Main" меняем начало функции на int Main{. Не работает, говорит "Unhandled exception at 0x7c9105f8 in test_new.exe: 0xC0000005: Access violation reading location 0x00000010.", выдает код для дебага в файле malloc.c:
#endif  /* _WIN64 */
return HeapAlloc(_crtheap, 0, size);
}
size правильный, _crtheap равен 0. Возникло предположение, что стуб, который опускается при смене точки входа, содержит код создания кучи, которую затем использует new, но добавление в начало HANDLE hHeap = HeapCreate(HEAP_NO_SERIALIZE, 0, 0); , а в конец HeapDestroy(hHeap); ситуацию не изменило. VC++ 2003, XP SP2, Cel1700
Почему?

okunek

я тут поигрался немножко...
как оказалось _crtheap создается в функции _heap_init в \crt\src\heapinit.c , а инклюд - в winheap.h
вот такой код работает:

#pragma comment(linker, "/ENTRY:main")
#define _CRTBLD
#include <../../crt/src/winheap.h>
#include <windows.h>

int main(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpszCmdLine, int nCmdShow)
{
_heap_init(0);
char *Str;
int n=100;
Str = new char [n];
delete [] Str;
_heap_term;
ExitProcess(0);
}
ЗЫ. все это читай как просто комент, ответа на вопрос я не знаю

Vladislav177Rus

Т.е., не меняя внутренних переменных, используемых для поддержки new, таких как __active_heap, одними лишь WinAPI, добиться его работы нельзя?

Dasar

> одними лишь WinAPI, добиться его работы нельзя?
конечно, нельзя
WinApi ничего не знает про какие-то там new и т.д.
ps
Выделяй память через WinApi функции (а не через c-ишные) и будет тебе счастье.

evgen5555

WinAPI - не C++
Оставить комментарий
Имя или ник:
Комментарий: