这个问题的背景是在用libevent的buffer_remove时出现的,写一个伪代码
char buffer[2048] ={0}; string str; int n = buffer_remove(buffer,sizeof(buffer)); str = string(buffer);
在这里断点调试时发现buffer的数据是正确的,转到str时,总会在字符串的结尾出现几个乱七八糟的字符且每次都不一样.
下面说一下原因,首先我们都知道每个字符串是以' '(即0)结尾的,而buffer_remove在从libevent的内存移到我们自己的buffer里时,是不会对字符串做改变的,接收到什么就往buffer理写什么,所以在断点调试时看到buffer里有2048个字符时,实际上是没有' '的,之所以能看到字符串大概是因为IDE的原因?
在string构造时,它是会找参数的的buffer *直到遇到‘ ’,并把这些深拷贝到string的成员变量char *中,所以如果我们的buffer没有' ',在找到buffer的第2048个字符后,就会继续在不属于buffer的内存里找(buffer后的这块内存很可能是混乱地),直到找到内存为0的地方停止。比如11 1a 34 57 00,11为buffer[2047],则string构造时会把1a 34 57也拷贝到内存中,于是就出现了描述的错误