2017-08-01 14 views
0

バックトレーススタックがリストされます。 getenv()を呼び出すだけです.gnu libcのバージョンは2.17です。getenv()コール時の__strlen_sse2のセグメント化エラー

const std::string NAME_ENV_KEY("NAME"); 
char const* name = getenv(NAME_ENV_KEY.c_str()); 

と名前環境がsettedさ:

(gdb) bt 
#0 0x00007ffff6c59b71 in __strlen_sse2() from /lib64/libc.so.6 
#1 0x00007ffff6c0b036 in getenv() from /lib64/libc.so.6 
#2 0x0000000000e23f5e in AdsProperties::AdsProperties (this=0x184ad60 
    <config>) at XXXXXX 
#3 0x0000000000a3d355 in __static_initialization_and_destruction_0 
    (__initialize_p=1, __priority=65535)at XXXXXXXX 
#4 0x0000000000a3d499 in _GLOBAL__sub_I_server_main.cpp(void) 
#5 0x0000000000eff50d in __libc_csu_init() 
#6 0x00007ffff6bf4ac5 in __libc_start_main() from /lib64/libc.so.6 
#7 0x000000000077b6e9 in _start() 

コードは次のようです。

答えて

0

グローバルコンストラクタ(およびデストラクタ)の場合、構築の順序は未定義です。あなたの場合、ポインタコンストラクタはおそらく文字列コンストラクタの前に呼び出されます。これを解決するには、建設注文を管理する「グローバル」クラス(たとえばCMyLoader)のインスタンスを作成します。

CMyloader::CMyloader() 
{ 
    const std::string NAME_ENV_KEY("NAME"); 
    m_name = getenv(NAME_ENV_KEY.c_str()); 
} 
CMyloader myLoader; 

はまた、1つのステップでの処理ができます。

char const* name = getenv(NAME_ENV_KEY("NAME").c_str()); 
+0

あなたは絶対的に正しいです。変数NAME_ENV_KEYはClassAの静的なconstメンバです(class_a.hで定義されています)。この変数の割り当てはclass_a.cppファイルにあります。次に、まずclass_a.cpp&class_a.hをclass_a.aにコンパイルします。 main.cppはClassAのコンストラクタを呼び出します。 ClassAのコンストラクタを呼び出すと、NAME_ENV_KEYの代入を実行できないと思います。 –

関連する問題