【问题标题】:segmentation fault in __strlen_sse2 when call getenv()调用 getenv() 时 __strlen_sse2 中的分段错误
【发布时间】:2017-08-01 08:36:56
【问题描述】:

列出了回溯堆栈。我们只是调用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环境。

【问题讨论】:

    标签: c++ segmentation-fault getenv


    【解决方案1】:

    对于全局构造函数(和析构函数),构造顺序是不确定的。在您的情况下,指针构造函数可能在字符串构造函数之前被调用。您可以通过创建一个“全局”类的实例(例如 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());
    

    【讨论】:

    • 你是绝对正确的。变量 NAME_ENV_KEY 是一个类的静态 const 成员:ClassA(可能在 class_a.h 中定义),该变量的赋值在文件 class_a.cpp 中。然后我们先将class_a.cpp & class_a.h编译成class_a.a。然后main.cpp调用ClassA的构造函数。我想当我们调用ClassA的构造函数时,无法执行NAME_ENV_KEY的赋值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-19
    • 2018-03-17
    • 2017-08-05
    • 2015-10-03
    • 2018-05-15
    相关资源
    最近更新 更多