I have following code:
vector<UINT_PTR> test = GetMemoryAddresses();
cout << "Size: " << test.size() << endl;
for (UINT_PTR a : test) {
cout << "Memory Address: " << hex << a << endl;
}
cout << "Size: " << test.size() << endl;
Which prints following results:
Size: 18
Memory Address: fc06a0
Memory Address: 13a70f0
Memory Address: 36c78c1
Memory Address: 3da0ea0
Memory Address: 3e21b80
Memory Address: c0a6881
Memory Address: c747690
Memory Address: c748b98
Memory Address: c74a1b8
Memory Address: c74ce10
Memory Address: c750c78
Memory Address: 1340a10f
Memory Address: 14376ea0
Memory Address: 14472649
Memory Address: 69867268
Memory Address: 6bdf9243
Memory Address: 7399a142
Memory Address: 76c54875
Size: 12
Removing the
<< hex
leads to the correct vector.size() of 18 again.
What is causing this memory coruption?
Have I done anything wrong?
std::hex
is "sticky". It sets the state of the stream to hexadecimal display and that is where it will stay until you change it. That means when you do
cout << "Size: " << test.size() << endl;
you display the size in hex and 18 decimal is 12 hex.
You need
cout << "Size: " << dec << test.size() << endl;
to switch back to decimal mode and display the size "correctly".
Another thing that would help you diagnosing this is to use std::showbase
. It is another "sticky" manipulator and will prepend hexadecimal output with 0x
. Using that in
cout << "Memory Address: " << hex << showbase << a << endl;
would have made your output
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
which makes it a lot more clear that the last call to cout
is still using hex
std::cout << std::hex;
makes all numbers printed by std::cout
print as hex. To get back to decimal again run:
std::cout << std::dec;
Ideally before using any stream format manipulators (like std::hex
) you should save the formatting flags and restore them when you are finished. For example:
auto flags = std::cout.flags();
std::cout << std::hex << 10 << "\n";
std::cout.flags( flags );
All of the flags need to be reset like this: https://en.cppreference.com/w/cpp/io/ios_base/flags
The fill character is also sticky: https://en.cppreference.com/w/cpp/io/basic_ios/fill and so is the precision: https://en.cppreference.com/w/cpp/io/ios_base/precision
The only one that isn't is the width flag: https://en.cppreference.com/w/cpp/io/ios_base/width
Boost has a utility class to reset all the stream state back to the initial values: https://www.boost.org/doc/libs/1_69_0/libs/io/doc/ios_state.html
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With