首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >向量在recvfrom调用中使用时指向未初始化的字节

向量在recvfrom调用中使用时指向未初始化的字节
EN

Stack Overflow用户
提问于 2011-01-04 09:25:13
回答 2查看 841关注 0票数 3

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

代码语言:javascript
复制
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中的缓冲区是如何指向未初始化字节的错误。自从我把它换成一个无符号字符数组后,我已经把它的范围缩小到了向量,一切都很好。有什么建议吗?

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-01-04 11:31:12

这一行是错误的:

代码语言:javascript
复制
int n = recvfrom(fd_, ret, buffSize, &recvAddress, &sockSize);

它应该是:

代码语言:javascript
复制
int n = recvfrom(fd_, &(*ret)[0], buffSize, 0, &recvAddress, &sockSize);

您直接将数据读取到std::vector数据结构中,该结构通常是3个指针(开始、结束和结束存储)。因此,您使用通过套接字接收的数据覆盖了这3个指针,然后覆盖了向量之后的随机内存。编译器不会报错,因为任何指针类型(本例中为std::vector<char> *)都可以隐式转换为void* (recvfrom的第二个参数)。

当然,您希望将数据读取到向量所指向的缓冲区中,该向量是通过获取其第一个元素&(*ret)[0]的地址而获得的。我们必须添加笨拙的圆括号,因为与一元取消引用运算符*相比,括号[]具有更高的运算符优先级。

(还要注意,recvfrom()flags参数遗漏了--我假设这只是写这个问题时的一个转录错误,现在我在这里将其设置为0。)

票数 7
EN

Stack Overflow用户

发布于 2011-01-04 09:49:24

recvfrom()只写入了n之前的字节,但您读取的是分配的整个缓冲区。不过,我不确定valgrind是否真的那么聪明。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4589917

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档