Skąd wiesz, że każde new
zaalokowało 4 bajty? Prawie na pewno tak się nie stało.
Alokator musi też gdzieś zmieścić różne dane dotyczące tej alokacji (np. ile ma zwolnić miejsca przy delete
). Dodatkowo od systemu operacyjnego prawdopodobnie zażądał od razu znacznie więcej na poczet przyszłych alokacji. Po trzecie sprawdzanie zużycia pamięci za pomocą jakiegokolwiek managera zadań może być mało miarodajne, użyj czegoś lepszego np. massifa (jedno z narzędzi Valgrinda).
Poza tym samo new
czy malloc
to nie wszystko. Te funkcje ostatecznie tylko "pobierają" pamięć od systemu operacyjnego (no chyba, że go nie ma, ale to inna sprawa). Sam system operacyjny może mieć najdziwniejsze strategie jej przydzielania i zarządzania tym. Np. na Linuksie alokacja prawie zawsze się udaje, nawet jeżeli zażąda się ogromnych ilości pamięci. To dlatego, że kernel pamięć fizyczną przydzieli dopiero wtedy, kiedy ten zaalokowany obszar będzie pierwszy raz użyty. Dopiero wtedy może się okazać, że już nie ma z czego przydzielać (nazywa się to overcommit). Oczywiście to nie ma powiązania z podanym przez Ciebie przykładem, chodzi o to, że to przydzielanie pamięci może nie być takie oczywiste jak się wydaje.
Podsumowując, jeżeli nie zna się szczegółów działania alokatora i systemu operacyjnego trudno powiedzieć dlaczego ta wartość k
wyszła jaka wyszła.