2017-08-01 26 views
0

列出了反向跟蹤堆棧。我們只需調用getenv(),gnu libc版本是2.17。當調用getenv()時,__strlen_sse2中的段出現故障()

(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() 

的代碼是這樣的:

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

和名字環境設置好的。

回答

0

對於全局構造函數(和析構函數),構造的順序是未定義的。在你的情況下,指針構造函數可能在字符串構造函數之前被調用。你可以通過創建一個'global'類的實例(例如CMyLoader)來解決這個問題,在這個類中你可以控制構建順序。

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

您也可以在一個單一的步驟:

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

你是絕對正確的。變量NAME_ENV_KEY是類的靜態常量成員:ClassA(可能在class_a.h中定義),並且此變量的分配位於文件class_a.cpp中。然後我們首先將class_a.cpp&class_a.h編譯爲class_a.a。然後main.cpp調用ClassA的構造函數。我想當我們調用ClassA的構造函數時,不能執行NAME_ENV_KEY的賦值。 –