2011-03-22 89 views
2

以下代碼(網絡服務器中的請求 - 響應循環的一部分)大部分時間都在工作,但有時會失敗,因爲客戶端會報告它已經得到了一些奇怪的其他字符串(看似來自本函數內存中附近位置的隨機字節,或空字節)。C++ std:字符串內存模型

string res = ""; 
if (something) { 
    res = "ok"; 
} 

if (res.length() > 0) { 
    send_data((void*) res.c_str(), res.length()); 
} 

在我看來,它似乎都「」和「OK」是不變的STD:字符串和解析度是一個指向其中的任何一個,這樣整個事情應該工作,但顯然事實並非如此,那麼有人可以向我解釋這裏發生了什麼?

+7

您的'send_data()'是否可能是非阻塞的,並且在完成之前破壞'res'? – vhallac 2011-03-22 13:44:32

+0

這也是一個很好的觀點。 – 2011-03-22 13:46:10

+1

這是正確的錢。我在這裏使用0MQ,並且正在試驗發送數據的非複製方式,但顯然在這種情況下無法正常工作。謝謝! – djc 2011-03-22 13:55:37

回答

6

你可能忘了送空終結符來表示字符串的結尾:

send_data((void*) res.c_str(), res.length()+1); 
+0

難道這不會給我帶來大部分像我想發送的字符串,但增加垃圾?這不是這種情況(這是一種暗示,但在我的問題中不完全清楚)。 – djc 2011-03-22 13:58:27

+0

是 - 除非是空字符串,否則什麼都不會發送(由於if子句)。 – 2011-03-22 13:59:31

1

你的代碼是好的,我想有一個在你的程序的一些內存損壞。

「」和「ok」實際上是'const char *'類型的零終止緩衝區,而不是字符串。當你將它們分配給您的字符串的所有數據都將被複制裏面的字符串內部緩衝區,不包括最後一個字符是零,所以

res = ""; 

將清除內部字符串緩衝區,並res.length()將變爲0。

res.c_str()將返回該緩衝區的地址,而不是「」或「ok」文字的地址。