Существует важное различие между количеством выделенных байтов и количеством байтов, которые вы видите.
Если lsize равен 64, вы действительно выделили себе 64 байта. Это не означает, что за экраном C ++ во время выполнения запросит у Windows ровно 64 байта. На практике менеджеры памяти требуют немного больше памяти, чтобы они могли выполнять свою домашнюю работу. Часто эти дополнительные байты выделяются ПЕРЕД указателем, возвращаемым из new / malloc, поэтому вы их никогда не увидите.
Однако это не ваша проблема. Проблема в том, что вы читаете 64 байта из файла, используя fread. Фред не знает, какие данные вы читаете. Это может быть структура, буфер символов, набор парных чисел ... Он просто читает эти байты для вас.
Это означает, что если файл содержит символы «ABC», вы получите именно «ABC». НО, в C строки должны заканчиваться нулем, поэтому если вы передадите этот буфер в printf, он продолжит сканирование памяти, пока не найдет нуль-символ.
Итак, чтобы решить вашу проблему, выделите еще 1 байт и установите последний байт в нулевой символ, например:
buffer = new BYTE[lSize+1];
buffer[lSize] = '\0';