我必须维护一些遗留代码,部分代码如下:
/* 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的访问从未失败,但我猜他们实际上也不安全,对吗?
答案 0 :(得分:3)
const char* p = conf().c_str();
conf()返回的临时字符串会尽快死掉;遇到了。因此,获取指向字符串内部内容的指针并不是一个好主意。 由于字符串被破坏,p将指向无效的内存。
答案 1 :(得分:3)
字符串对象将是活着的 auto var所以指针应该是 有效期至此结束 函数,是吗?
错误。 conf()
函数调用返回的临时值与其所属的完整表达式一样长,而不是包含该调用的函数的长度。