列出了回溯跟踪堆栈。我们只称 getenv((,gnu libc 版本是 2.17 。
(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());
并设置了 NAME 环境。
对于全局构造函数(和析构函数(,构造顺序是不确定的。在您的情况下,指针构造函数可能在字符串构造函数之前调用。您可以通过创建"全局"类的实例(例如 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());