Полный текст исходника: Код (Text): #define WIN32_LEAN_AND_MEAN #pragma comment(linker,"/MERGE:.rdata=.text") #pragma comment(linker, "/subsystem:windows") #pragma comment(linker,"/ENTRY:main") #pragma comment(linker,"/NODEFAULTLIB:LIBCMT /NODEFAULTLIB:OLDNAMES") //#pragma warning(disable : 4530) #pragma comment(lib, "kernel32.lib") #pragma comment(lib, "user32.lib") #include <windows.h> #define size 100000L //==================================================================== ===== void main() { unsigned int* array; array = new unsigned int[size]; MessageBox(0, "array created", "caption", MB_ICONASTERISK); delete[] array; return; } Ключи: /Ox /EHsc Компилируется и линкуется без варнингов и ошибок. На array = new unsigned int[size]; выпадает. Где тут грабли - не пойму. Самое непонятное - в другом проекте эта конструкция работает.
Ты используешь new, а это часть "runtime C library" (CRT), которая требует своей инициализации. Если бы ты не переопределил точку входа, всё было бы нормально. Хочешь маленькое приложение? Читай соответствующую статью на UINC или примеры с этого форума. Но придётся отказаться от CRT и использовать только чистый WinAPI (как на асме). Хочешь CRT? Не извращайся. Есть и компромисс: использовать альтернативные облегчённые версии CRT (libctiny, wincrt и куча других). В конце концов, можешь создать свою альтернативу.
Тогда почему компилятор не ругнулся и пропустил это? Куда менее значительные вещи подмечает, а тут... Да crt мне со своим new собственно даром не сдался, до сих пор делал маленькие на чистых апи, и дальше буду, просто хотел сравнить выделение памяти с new, VirtualAlloc и SysAllocString. Ну лады, спасибо, учту замечание о точке входа.
А откуда компилятор знает, с какого места начнётся исполнение кода? Чего там сравнивать, new спускается к Heap* или Virtual*, в зависимости от размера. На РСДН не раз сравнения по скорости проводили различных аллокаторов.
new можно использовать и с измененной точкой входа, вот пример: Код (Text): #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); }
Вот потому std мне и не нравится Потянешь ниточку - весь клубок размотать придётся. То ли дело апи: Код (Text): int* alloc( int dwSize ){ return (int*) VirtualAlloc( NULL, dwSize, MEM_COMMIT, PAGE_READWRITE ); } вот тебе и весь new... В апях я чувствую себя достаточно комфортно, а изучать стандартные либы - какой смысл? Кроме раздувания размера файла и доп. тормозов никаких новых возможностей не вижу. Кросплатформенность и классовость мне безразличны.
Хм.. Использовать VA для выделения нескольких байт? Черезчур.. лучше уж HeapAlloc. Потом, почему int*, а не char*? захочешь потом инкрементировать указатель и удивишься. Если не нужны библиотеки - не используй. Пиши на С, зачем тебе new?
Я уже однажды удивлялся, почем у меня HWND* по четыре штуки скачет Эти грабли мне уже знакомы. Можно и HeapAlloc, непринципиально, главное под контролем, и на new грабли я уже не наступлю )