在我正在编写的函数中,我试图返回一个指向无符号字符向量的指针。相关代码如下。
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中的缓冲区如何指向未初始化的字节。我把它缩小到向量,因为我把它换成了一个unsigned char数组,一切正常。有什么建议吗?
编辑1:修正了一些代码,是从内存/笔记中做到这一点,我遇到了一个问题。我开始使用valgrind的原因是我在那个地方遇到了分段错误。我会仔细检查明天我在做什么。
答案 0 :(得分:7)
这一行错了:
int n = recvfrom(fd_, ret, buffSize, &recvAddress, &sockSize);
应该是:
int n = recvfrom(fd_, &(*ret)[0], buffSize, &recvAddress, &sockSize);
您正在将数据直接读取到std::vector
数据结构上,通常是3个指针(开始,结束和存储结束)。所以,你用套接字接收的数据覆盖了那3个指针,然后你在向量之后覆盖了随机内存。编译器不会抱怨,因为任何指针类型(在这种情况下为std::vector<char> *
)都可以隐式转换为void*
(第二个参数为recvfrom
)。
您当然希望将数据读入向量所指向的缓冲区,该缓冲区是通过获取其第一个元素的地址(即&(*ret)[0]
)获得的。我们必须添加笨拙的括号,因为括号[]
的运算符优先级高于一元解除引用运算符*
。
答案 1 :(得分:0)
n
仅写入recvfrom()
之前的字节,但您正在读取已分配的整个缓冲区。我不确定valgrind真的那么聪明。