2009-02-12 47 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); 

這確實解決了這個問題。

相關問題