【问题标题】:Valgrind detecting invalid reads in strlenValgrind 检测 strlen 中的无效读取
【发布时间】:2011-08-13 11:55:03
【问题描述】:

我正在使用 Valgrind 来检测我的库中的内存泄漏/错误,这是我第一次使用它。这似乎表明std::string 中有一些无效读取。

这是错误信息的开头

==16214== Invalid read of size 1
==16214==    at 0x402701D: strlen (mc_replace_strmem.c:282)
==16214==    by 0x40E53AA: std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, std::allocator<char> const&) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.14)
==16214==    by 0x42FD03E: LHAPDF::Fortran_PDF_Base::initAlphasPDF() (Fortran_PDF_Base.C:290)

剩下的只是更多的回溯。我的代码行是一个结构的构造函数,它接受两个std::strings 作为参数。

我不相信std::string 做错了什么,那么可能的问题是什么?

编辑 - 结构构造函数:

AlphaS_Info() {}
AlphaS_Info(bool fixed, Order order, std::string method, std::string symbol,
            double alfasQ, int alfasQParm, double Q0, double mc, double mb, double mt) :
  m_fixed(fixed), m_order(order), m_method(method), m_symbol(symbol),
  m_mc(mc), m_mb(mb), m_mt(mt), m_alfasQ(alfasQ), m_Q0(Q0), m_alfasQParm(alfasQParm) {}

调用构造函数:

p_info->p_asinfo = new LHAPDFTOOLS::AlphaS_Info(fixed, evoOrder, method, symbol, alfasQ, alfasQParm, Q0, cmass, bmass, tmass);

【问题讨论】:

  • 我实际上不知道哪个代码是相关的。正如我所说,它“发生”的行是一个构造函数。但它是一个简单地填充结构的构造函数。我会把它放进去。

标签: c++ memory valgrind


【解决方案1】:

可能您将无效字符串传递给构造函数,例如通过使用指向已删除字符串的指针/引用。

【讨论】:

  • 这正是我所做的——我传递了一个 const char *,它是我之前使用 std::string 的 c_str 方法创建的。除了我使用的原始字符串超出范围 - 因此指针无效!
  • 还要检查字符串是否以空值结尾。许多 C 函数(如 freadstrncpy)不会自动以空值终止字符串。
猜你喜欢
  • 2020-09-30
  • 2017-10-20
  • 1970-01-01
  • 1970-01-01
  • 2018-07-07
  • 1970-01-01
  • 1970-01-01
  • 2017-04-09
  • 2015-07-07
相关资源
最近更新 更多