2013-03-20 79 views
0

我正在開發一個項目,我必須傳輸序列化數據。數據使用boost框架進行序列化,然後存儲到一個stringstream中,最後存入一個std :: string。爲了傳輸數據,數據(存儲爲char *,給出的!)和字符串的長度都被存儲並可以在目的地提取。但是,當試圖提取數據時,我只收到空字符串。我已經嘗試過的方式到目前爲止是:char *(包含null值)std :: string知道長度

C[i]=*new std::string(content, getDataChunk(), content.getDataLength()); 

C[i].append(content.getDataChunk(), content.getDataLength()); 

而的std :: string * C =新的std :: string [K],我< K.

char* p = content.getDataChunk(); 
     int l = content.getDataLength(); 
     for (int j = 0; j < l; j++) { 
      C[i].insert(j, p[j], 1); 
     } 

(這引發了一個異常權在開始 - 我猜是因爲NULL值(S)!?)的

顯然的strcpy(),因爲這是不行的我們es char *作爲目標,它再次以NULL結尾...

有沒有人對如何解決這個問題有想法?我希望我不是每天都會問一些問題,但是在很多答案中,很難消除這種機會;)

任何提示都非常感謝 - TIA!

歡呼聲, 亞歷

+0

如果你保存了表達式'* new something'的值,你將會發生內存泄漏。 – 2013-03-20 13:41:48

+0

'C [i] = * new std :: string ...'是內存泄漏。將其更改爲'C [i] = std :: string ...' – 2013-03-20 13:42:14

+0

@JoachimPileborg吧,謝謝!我想它使用C [i] = std :: string(...),正確嗎? – astriffe 2013-03-20 13:47:09

回答

5

爲什麼不只是做

C[i] = std::string(content.getDataChunk(), content.getDataLength()); 

它會做正確的事情,複製完整的字符串,即使它已經在它的嵌入式'\0'字符。

+0

非常感謝!在這種情況下,我猜錯誤必須在其他地方,我只是沒有看到它在哪裏,並認爲它必須在這一行...... – astriffe 2013-03-20 14:14:28

+0

我想這不會做正確的事情 - 如果我用char * p =新字符[11]; p =「地獄\ 0世界」;然後:cout << string(p,11);輸出將是'地獄'(字符串長度11)。或者我誤解了任何東西? – astriffe 2013-03-21 14:18:03

+0

@astriffe使用叮3.3測試(使用libC++),它工作正常。你使用的是什麼編譯器和版本? – 2013-03-21 14:23:26