2009-02-12 42 views
1
std::string sAttr(""); 
sAttr = sAttr+VAL_TAG_OPEN+sVal->c_str()+VAL_TAG_CLOSE; 

否则运行时的依赖性,其中在所述代码中,我已经定义为的std :: string级联

const char VAL_TAG_OPEN[] = "<value>"; 

sVal是断开串的指针的阵列的检索到的变量。这在大多数系统,windows和linux中都可以正常工作。然而,在一个客户站点,我认为我的信仰有一个我们已经做了一些广泛的测试的Linux版本,产生一个结果,就好像我从未使用过VAL_TAG_OPENVAL_TAG_CLOSE。我收到的结果是针对

sAttr = sAttr+sVal->c_str(); 

发生了什么事? std :: string连接是否在运行时变化?

回答

2

为什么->c_str()?如果sValstd::string,请尝试删除此呼叫。请记住,评估的顺序是未定义的,因此您最终可能会添加指针而不是连接字符串,因为VAL_TAG_OPEN,sVal->c_str()VAL_TAG_CLOSE都是纯C字符串。我建议您使用附加赋值运算符+=,例如:

sAttr += VAL_TAG_OPEN; 
sAttr += *sVal; /* sVal->c_str() ? */ 
sAttr += VAL_TAG_CLOSE; 

(反正它应该更快)。

+0

它很可能是(* SVAL),但当然有人会问为什么要使用一个指针这里如果引用就足够了(永久的std :: string常量和参数,我猜)。 – gimpf 2009-02-12 11:19:10

+0

sVal是一个指向std :: string的指针。 此外,sVal是唯一可以追加的东西。 – rptony 2009-02-12 11:19:53

+0

我明白了,我只是在问题之前看到了答案,我的老习惯。 – gimpf 2009-02-12 11:28:17

1

不,std :: string连接绝对不应该依赖于运行时,但不知何故VAL_TAG_OPENVAL_TAG_CLOSE似乎是空字符串。

我猜你已经某种缓冲区溢出或无效的指针运算的地方,让你的程序覆盖含有这些“常量”值的内存。无论你的内存何时确实是运行时(以及因此操作系统版本)都是特定的。过去我通过切换编译器或优化器选项而陷入了类似的情况。如你所说的在原始数组中保留原始指针std :: string实例,这样的错误实际上并非全部都是不可能的,但可能很难检测到,因为使用DEBUG编译不会给你任何迭代器检查所有这一切都为RAW的东西...祝你好运。

0
sAttr = sAttr+VAL_TAG_OPEN+sVal->c_str()+VAL_TAG_CLOSE; 

就像fbonnet说的那样,它是一个评估问题的顺序。

如果该行严格按照从左到右的顺序进行评估,则每个添加的结果都是一个std :: string对象,它具有一个用于添加的运算符重载,而且事情按照您的预期工作。

如果没有得到评估从左到右,那么你拉闸指针加在一起,谁知道什么,将让你。

避免这种结构,只使用上的std :: string + =运算符。

1

我不知道事情的,是造成这一问题的评价的顺序。因为一开始定字符数组的它,并最终

const char VAL_TAG_OPEN[] = "<value>"; 
const char VAL_TAG_CLOSE[] = "</value>" 

连接操作符认为VAL_TAG_OPN和VAL_TAG_CLOSE不空终止字符串。因此,优化器忽略他们认为它是垃圾。

sAttr += std::string(VAL_TAG_OPEN); 
sAttr += *sVal; 
sAttr += std::string(VAL_TAG_CLOSE); 

这确实解决了这个问题。

相关问题