Посмотрите, пожалуйста, этот код, на моей машине, он не вызывает ошибку, но я не понимаю, почему я могу скопировать больше байтов, чем выделено VirtualAlloc, безопасна ли эта операция?
PBYTE pNewBuffer = (PBYTE) VirtualAlloc(NULL,3,MEM_COMMIT,PAGE_READWRITE);
BYTE FlagThree[] = {'a', 'b', 'c', 'd','e','f','g'};
CopyMemory(pNewBuffer,FlagThree,sizeof(FlagThree));
Я выделяю 3 байта, но копирую в память 7 байтов.
VirtualAlloc округляет ваше распределение до ближайшей границы выделения, поэтому, хотя вы запрашиваете 3 байта, вы фактически выделите больше, так как гранулярность распределения составляет 64 КБ.
Благодаря этому вы можете записать больше, чем 3 байта, которые вы запрашивали. Однако, как упоминалось в комментариях, это неопределенное поведение, и вы не должны этого делать.
Это не неопределенное поведение. Фактически, он полностью определен, так как в документации явно указано, что «Если параметр lpAddress равен NULL, это значение (dwSize) округляется до границы следующей страницы».
Так что, пока вы не превысите размер страницы, это довольно безопасно.
В то время как другие ответы на этот пост (округление вверх) в данном конкретном случае полностью верны, ваш вопрос заставляет меня думать, что вы должны понимать, что C ++ называет неопределенным поведением.
В самый В других ситуациях в C ++, в отличие от языков, таких как Java или C #, выполнение «плохого» действия может не вызвать немедленного сбоя программы, а привести к ее неправильной работе странным образом. Или просто беги, как ты ожидаешь. Его просто не определено, что будет счастливее. Читайте об этом.