2011-08-13 51 views
4

我正在使用Valgrind檢測庫中的內存泄漏/錯誤,這是我第一次使用它。它似乎暗示std::string中有一些無效讀取。Valgrind檢測strlen中的無效讀取

以下是錯誤消息

==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::string s作爲參數。

我不相信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); 
+0

請向我們展示代碼 –

+0

我實際上並不知道哪些代碼是相關的。正如我所說,它「發生」的線是一個構造函數。但它是一個簡單填充結構的構造函數。我會把它放進去。 – VolatileStorm

+0

來電者和被調用者代碼。 –

回答

8

也許你使用指針/引用一個字符串傳遞一個無效的字符串轉換成你的構造,例如已經被刪除。

+2

這正是我所做的 - 我傳遞了一個const char *,它是我之前使用std :: string的c_str方法創建的。除了我使用的原始字符串已經超出範圍 - 因此指針是無效的! – VolatileStorm

+1

還要檢查字符串是否以空字符結尾。像'fread'和'strncpy'這樣的許多C函數不會自動以空字符結束字符串。 –