作者:马宝宝 | 来源:互联网 | 2022-11-14 17:32
我有以下代码:
vector test = GetMemoryAddresses();
cout <<"Size: " <
打印以下结果:
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
删除
<
导致再次出现18的正确vector.size().
造成这种记忆腐败的原因是什么?
我做错了什么吗?
有人可以告诉我发生了什么事吗?
C++总能让我感到惊讶.
1> NathanOliver..:
std::hex
是"粘性的".它将流的状态设置为十六进制显示,直到您更改它为止.这意味着当你这样做
cout <<"Size: " <
以十六进制显示大小,18十进制为十六进制.
你需要
cout <<"Size: " <
切换回十进制模式并"正确"显示大小.
另一件可以帮助您诊断的事情是使用std::showbase
.它是另一个"粘性"操纵器,并将前置十六进制输出0x
.使用它
cout <<"Memory Address: " <
会产生你的输出
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
@Ojav不用担心。有些操纵器不是“粘性”的,有些则是“粘性”的。学习哪个是花费时间。
2> Alan Birtles..:
std::cout <
使所有数字std::cout
打印为十六进制.要再次返回到十进制运行:
std::cout <
理想情况下,在使用任何流格式操纵器(如std::hex
)之前,您应该保存格式化标志并在完成后恢复它们.例如:
auto flags = std::cout.flags();
std::cout <
所有标志都需要像这样重置:https://en.cppreference.com/w/cpp/io/ios_base/flags
填充字符也是粘性的:https://en.cppreference.com/w/cpp/io/basic_ios/fill,精度也是如此:https://en.cppreference.com/w/cpp/io/ios_base/精确
唯一不是宽度标志:https://en.cppreference.com/w/cpp/io/ios_base/width
Boost有一个实用程序类,可以将所有流状态重置为初始值:https://www.boost.org/doc/libs/1_69_0/libs/io/doc/ios_state.html
@Ojav它没有改变,0x12是18