解决valgrind内存错误不指向我的代码

Solving valgrind memory error not pointing to my code

本文关键字:我的 代码 valgrind 内存 错误 解决      更新时间:2023-10-16

Valgrind给了我这个:

==26348== Invalid read of size 8
==26348==    at 0x4EC3DA8: std::ostream::flush() (in /usr/lib64/libstdc++.so.6.0.19)
==26348==    by 0x4E9E477: std::ios_base::Init::~Init() (in /usr/lib64/libstdc++.so.6.0.19)
 ==26348==    by 0x5684E58: __run_exit_handlers (in /lib64/libc-2.17.so)
==26348==    by 0x5684EA4: exit (in /lib64/libc-2.17.so)
==26348==    by 0x566DAFB: (below main) (in /lib64/libc-2.17.so)
==26348==  Address 0xffefffd98 is just below the stack ptr.  To suppress, use: --workaround-gcc296-bugs=yes

我如何找到这个错误是在我的代码,如果它不指向任何行?

我在AWS的Linux实例上使用g++进行编译。

编辑

好吧,似乎不知何故,我离开了程序在一个无效的状态关于流(谢谢)从主返回后。我确实打电话给

std::ifstream in(argv[1]);
std::cin.rdbuf(in.rdbuf());
std::ofstream out(argv[2]);
std::cout.rdbuf(out.rdbuf());

在从main返回之前,我需要在这里做什么来清理吗?

它实际上是由exit触发的:你的main函数完成了它的工作,程序处于清理阶段,比如调用全局对象的析构函数和关闭流。

错误本身很可能在代码的早期某个地方,使程序处于某种无效状态,仅在最后才成为问题。


在您的评论中,您说您将cout的流缓冲区更改为您自己的东西。你后来把它设置回默认值了吗?否则,在main结束时,当程序试图flushstd::cout时,它可能会访问不再存在的流缓冲区。

参见示例:http://www.cplusplus.com/reference/ios/ios/rdbuf/

相关文章: