在recvfrom调用中,向量指向未初始化的字节

在我正在写一个函数,我试图返回一个指向无符号字符向量的指针。 相关代码如下。

std::vector<unsigned char> *ret = new std::vector<unsigned char>(buffSize,'0'); //Due to suggestions... int n = recvfrom(fd_, ret, buffSize, &recvAddress, &sockSize); //Forgot to include this in the original ret->resize(n); // display chars somehow just for testing for(std::vector<unsigned char>::iterator it=ret->begin(); it<ret->end();it++) { std::cout<<*it; } std::cout<<std::endl; ... return ret; 

当我通过valgrind运行这个时,我得到错误,谈论recvfrom中的缓冲区如何指向未初始化的字节。 我已经缩小到vector,因为我换了一个无符号的字符数组,一切工作正常。 有什么build议么?

编辑1:修正了一些代码,是从内存/笔记这样做,我有工作的问题。 我开始使用valgrind的原因是我在那个地方遇到了分段错误。 我会仔细检查明天我在做什么。

这一行是错误的:

 int n = recvfrom(fd_, ret, buffSize, &recvAddress, &sockSize); 

它应该是:

 int n = recvfrom(fd_, &(*ret)[0], buffSize, &recvAddress, &sockSize); 

您正在将数据直接读入std::vector数据结构,通常是3个指针(开始,结束和存储结束)。 所以,你用这个套接字接收到的数据覆盖了这三个指针,然后在这个vector之后覆盖了随机存储器。 编译器不会抱怨,因为任何指针类型(本例中为std::vector<char> * )都可以隐式转换为void* (第二个参数为recvfrom )。

你当然要读取数据到由向量指向的缓冲区,这是通过获取其第一个元素的地址,即&(*ret)[0] 。 由于括号[]运算符优先级高于一元的解引用运算符*所以我们必须加上不好的括号。

只有最多n个字节由recvfrom()写入,但是您正在读取分配的整个缓冲区。 虽然我不确定valgrind是否真的很聪明。