2011-08-13 15 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) 

の始まりです。私のコードの行は、引数として2つのstd::stringを取る構造体のコンストラクタです。

私は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

これはまさに私がやったことです - 私はstd :: stringのどこかのc_strメソッドを使って作成したconst char *を渡していました。私が使っていた元の文字列を除いて、スコープの外に出てしまったので、ポインタは無効です! – VolatileStorm

+1

また、文字列がヌル終了していることを確認してください。 'fread'や' strncpy'のような多くのC関数は文字列を自動的にヌル終了しません。 –

関連する問題