BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #102613同步于 2023/4/20
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

关于 malloc(): memory corruption 的问题

zhangwentai
2023/4/20镜像同步13 回复
起因是自己的程序出现了这样的报错,然后通过cout 打印信息定位到了出错在一行初始化vector的语句。 然而,把这个语句单独放在main函数前面完全没错 受这篇博文的启发: https://blog.csdn.net/u011334536/article/details/106150555 我在那行语句之前进行排查,发现确实有越界访问数组的行为。 想请问为什么编译器不会在越界访问数组的时候报错,而是在malloc出现异常才报错。 编译器:g++ (Ubuntu 5.4.0-6ubuntu1~16.04.12) 5.4.0 20160609
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
RinChanNOW机器人#1 · 2023/4/20
bd
changing机器人#2 · 2023/4/20
bd
nuanyangyang机器人#3 · 2023/4/20
这是C/C++的缺陷。Rust语言越界访问就会panic。
Vampire机器人#4 · 2023/4/20
可以编译时打开 sanitizer 的运行时检查 -fsanitize=xxx
buptrh机器人#5 · 2023/4/20
这种能在论坛发贴解决的问题感觉chatgpt都能搞定。 试了一下,这个是回复: 在C++中,访问越界数组元素是未定义行为(Undefined Behavior),这意味着编译器不会强制执行任何特定的行为。许多因素可能会影响程序在出现未定义行为时的表现,例如编译器实现、操作系统、硬件等等。 在您的情况下,可能是由于访问越界导致的未定义行为在运行时未被检测到,这使得程序的行为变得不可预测。而程序在初始化vector时,需要动态分配内存,因此当访问越界导致内存出现异常时,才会在malloc处报错。 为了避免这种未定义行为和内存越界访问,您应该始终确保您的程序在使用数组或指针时不会访问超出其边界的元素,并使用valgrind等工具来检测内存错误。
czdsss机器人#6 · 2023/4/21
ChatGPT好像说了些什么,但好像又什么都没说。。。并没有回答楼主的问题。 【 在 buptrh 的大作中提到: 】 : 这种能在论坛发贴解决的问题感觉chatgpt都能搞定。 : 试了一下,这个是回复: : ............
Gomez机器人#7 · 2023/4/21
数组越界属于未定义行为,这种情况下发生任何事情(包括在后台执行rm -rf /*,如果编译器作者乐意的话)都是符合标准的,编译器没有报错的责任
Gomez机器人#8 · 2023/4/21
如果你感兴趣,可以看看这个问题: 如果编译器遇到未定义行为把硬盘格式化了,需要负法律责任吗? https://www.zhihu.com/question/47162882
sxfx机器人#9 · 2023/4/21
建议vector用.at()而不是[],.at会检查是否越界