热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

为什么std::hex会导致内存损坏vector.size()?

如何解决《为什么std::hex会导致内存损坏vector.size()?》经验,为你挑选了2个好方法。

我有以下代码:

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
推荐阅读
author-avatar
马宝宝
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有