Может быть несколько причин, почему вы видите такой большой объем памяти в вашей тестовой программе. Внутри вашего
void size_check::stuff_me( unsigned int howMany )
{
Этот метод всегда вызывается с howMany
= 50000.
package = new size_type[howMany];
Предполагая, что это на 32-битной установке, вышеприведенный оператор выделит 50 000 * 4 байта.
for( unsigned int i = 0; i < howMany; ++i )
{
size_type *me = new size_type;
Выше будет выделять новое хранилище на каждой итерации цикла. Так как это зацикливает 50 000, а выделение никогда не удаляется, это фактически занимает еще 50000 * 4 байта после завершения цикла.
*me = 33;
package[i] = *me;
}
}
Наконец, поскольку stuff_me()
вызывается 20 раз из main()
, ваша программа выделяла бы по крайней мере ~ 8 Мбайт после завершения. Если это в 64-битной системе, то занимаемая площадь, вероятно, удвоится, поскольку sizeof(long)
== 8 байтов.
Увеличение потребления памяти может быть связано с тем, как VS реализует динамическое распределение. По соображениям производительности, возможно, что из-за нескольких вызовов new
ваша программа резервирует дополнительную память, чтобы избежать загрузки ОС каждый раз, когда ей требуется больше.
К вашему сведению, когда я запускал вашу тестовую программу на mingw-gcc 4.5.2, потребление памяти составляло ~ 20 Мбайт - намного ниже, чем вы видели, но все равно было значительным. Если я изменил метод stuff_me на это:
void size_check::stuff_me( unsigned int howMany )
{
package = new size_type[howMany];
size_type *me = new size_type;
for( unsigned int i = 0; i < howMany; ++i )
{
*me = 33;
package[i] = *me;
}
delete me;
}
Потребление памяти несколько снижается до ~ 4-5 Мбайт.