std::hex
"липкий".Он устанавливает состояние потока в шестнадцатеричное отображение, и именно там он будет оставаться, пока вы не измените его.Это означает, что когда вы делаете
cout << "Size: " << test.size() << endl;
, вы отображаете размер в шестнадцатеричном формате, а 18 десятичное значение равно 12 шестнадцатеричным.
Вам необходимо
cout << "Size: " << dec << test.size() << endl;
, чтобы вернуться в десятичный режими отобразите размер «правильно».
Еще одна вещь, которая поможет вам диагностировать это, это использовать std::showbase
.Это еще один «липкий» манипулятор, в котором шестнадцатеричный вывод будет добавлен 0x
.Использование этого в
cout << "Memory Address: " << hex << showbase << a << endl;
сделало бы ваш вывод
Size: 18
Memory Address: 0xfc06a0
Memory Address: 0x13a70f0
Memory Address: 0x36c78c1
Memory Address: 0x3da0ea0
Memory Address: 0x3e21b80
Memory Address: 0xc0a6881
Memory Address: 0xc747690
Memory Address: 0xc748b98
Memory Address: 0xc74a1b8
Memory Address: 0xc74ce10
Memory Address: 0xc750c78
Memory Address: 0x1340a10f
Memory Address: 0x14376ea0
Memory Address: 0x14472649
Memory Address: 0x69867268
Memory Address: 0x6bdf9243
Memory Address: 0x7399a142
Memory Address: 0x76c54875
Size: 0x12
, что делает намного более ясным, что последний вызов cout
все еще использует hex