访问std :: string :: c_str()返回的指针时内容发生了变化(清除?)

时间:2010-05-14 11:19:29

标签: c++

我必须维护一些遗留代码,部分代码如下:

/* this class reads a ini file which looks like this:
   key =  value
 */
class Config{
    // ..
public:
    string conf(const char* key)
    {
        vector<string> v;
        //..
        v = func(); //this function returns a vector<string>

        return v[1];
    }
};

void test()
{
    // a globla Config object cfg is initialized outside 

    const char* p = cfg.conf("key1").c_str();

    // the string object will be alive as a auto var
    // so the pointer should be valid till the end of this function,right?

    // ... lots of steps, but none of them would access the pointer p

    some_call(cfg.conf("key2").c_str());
    some_call(cfg.conf("key3").c_str());
    some_call(cfg.conf("key4").c_str());

    // the above calls never fail 

    // but when try to access p here, SOMETIMES the contents would change ... Why?

    /* the platform is solaris 64 bit
       compiler is sun workshop 12
       my code is compiled as 
       ELF 32-bit MSB relocatable SPARC32PLUS Version 1, V8+ Required
       but need to link with some shared lib which are ELF 32-bit MSB 
       dynamic lib SPARC Version 1, dynamically linked, stripped
    */  
}

原始代码已经运行了几年而且从未失败过(纯粹的运气?)。最近我们决定将其迁移到更新的平台,并且注释中描述的问题开​​始出现。

Neil Butterworth和aJ在这句话中指出了临时字符串obj:

const char* p = cfg.conf("key1").c_str();

会立即死亡;虽然在我的测试中,对key2,key3,key4的访问从未失败,但我猜他们实际上也不安全,对吗?

2 个答案:

答案 0 :(得分:3)

const char* p = conf().c_str();

conf()返回的临时字符串会尽快死掉;遇到了。因此,获取指向字符串内部内容的指针并不是一个好主意。 由于字符串被破坏,p将指向无效的内存。

答案 1 :(得分:3)

  

字符串对象将是活着的   auto var所以指针应该是   有效期至此结束   函数,是吗?

错误。 conf()函数调用返回的临时值与其所属的完整表达式一样长,而不是包含该调用的函数的长度。