C ++ std:字符串内存模型

时间:2011-03-22 13:41:34

标签: c++ string memory

以下代码(网络服务器中的请求 - 响应循环的一部分)大部分时间都在工作,但有时会失败,因为客户端会报告它有一些奇怪的其他字符串(看似随机字节来自附近的位置)此函数中的内存,或空字节)。

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

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

在我看来,似乎“”和“ok”都是常量std:字符串,而res是指向其中任何一个的指针,因此整个事情应该有效,但显然情况并非如此,有人可以向我解释一下这里发生了什么吗?

2 个答案:

答案 0 :(得分:6)

您可能忘记发送null-terminator来表示字符串的结尾:

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

答案 1 :(得分:1)

你的代码没问题,我想你的程序中存在一些内存损坏。

“”和“ok”实际上是'const char *'类型的零终止缓冲区,而不是字符串。当你将它们分配给你的字符串时,它们的所有数据都被复制到字符串内部缓冲区中,不包括最后一个为零的字符,所以

res = "";

将清除内部字符串缓冲区,res.length()将变为0。

res.c_str()将返回该缓冲区的地址,而不是“”或“ok”文字的地址。