2013-03-20 82 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