我有一个对象以这种方式返回垃圾inet地址,尽管from
有效:
public:
const sockaddr* getFromAddr () { return reinterpret_cast<const sockaddr*>(&from); }
private:
sockaddr_storage from;
原来返回的地址是160个字节。整理一下以使调试更容易:
const sockaddr* getFromAddr () {
auto sa = reinterpret_cast<const sockaddr*>(&from);
return sa;
}
然后在gdb中,在返回处中断:
(gdb) p sa
$1 = (const sockaddr *) 0x6130000000f0
gdb) p &from
$2 = (sockaddr_storage *) 0x613000000050
更让我感到困惑的是,如果我在返回之前添加它:
fprintf(stderr, "&from %p sa %p", &from, sa);
我得到:
&from 0x6130000000f0 sa 0x6130000000f0
但是调试输出再次显示sa
指向from
下方160个字节。
此行为无法以这种方式再现:
sockaddr_storage ss;
auto sa = reinterpret_cast<const sockaddr*>(&ss);
printf("%p %p\n", &ss, sa);
而且这与我一直使用sockaddr_storage
投射sockaddr*
的唯一位置相去甚远。这只是第一次出现问题,这让我非常恐惧。
我也尝试过普通的C语言转换。我使用过memchecking,但未显示任何问题(而且,由于在强制转换中地址似乎有错误,并且该程序是一个线程,因此,除非它是一个库,否则我看不出有什么不好的地方。错误)。
代码在等待传入连接时在Reactor中运行。连接请求将被接受。