【问题标题】:Solving valgrind memory error not pointing to my code解决 valgrind 内存错误未指向我的代码
【发布时间】:2015-09-16 18:37:32
【问题描述】:

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++ 编译。

编辑

好吧,在从 main 返回后,我似乎不知何故让程序处于关于流的无效状态(谢谢)。我确实打电话给

std::ifstream in(argv[1]);
std::cin.rdbuf(in.rdbuf());

std::ofstream out(argv[2]);
std::cout.rdbuf(out.rdbuf());

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

【问题讨论】:

  • 您是否以某种方式明确地销毁了std::cout(或任何其他具有静态存储持续时间的std::ostream)或对它做了什么奇怪的事情?
  • 使用返回全局的函数,来缓解全局初始化的失败。
  • 我确实打电话给std::ofstream out(argv[2]); std::cout.rdbuf(out.rdbuf());

标签: c++ segmentation-fault valgrind iostream


【解决方案1】:

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

错误本身很可能出现在代码的早期位置,使程序处于某种无效状态,直到最后才成为问题。


在您的 cmets 中,您说您将 cout 的流缓冲区更改为您自己的东西。你后来有没有把它恢复为默认值? 否则,在main 结束时,当程序尝试flush 时,std::cout 可能会访问不再存在的流缓冲区。

查看示例:http://www.cplusplus.com/reference/ios/ios/rdbuf/

【讨论】:

猜你喜欢
  • 2020-01-23
  • 1970-01-01
  • 2011-04-08
  • 2018-01-31
  • 1970-01-01
  • 2022-09-29
  • 2018-07-27
  • 1970-01-01
  • 2017-03-28
相关资源
最近更新 更多