ошибка сегментации в __strlen_sse2 при вызове getenv ()

Стек обратной трассировки указан в списке. Мы просто вызываем 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 установлена.

0

Решение

Для глобальных конструкторов (и деструкторов) порядок построения не определен. В вашем случае конструктор указателя, вероятно, вызывается перед конструктором строки. Вы можете решить эту проблему, создав экземпляр «глобального» класса (например, 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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]