我正在开发一个需要通过FTP进行交互的应用程序。对于这种通信,我目前在Windows上使用C ++,Visual Studio和Poco。
以下行导致bad_alloc异常......
ftp = new FTPClientSession("127.0.0.1", 21);
所以我下来尝试初始化StreamSocket,也失败了......
StreamSocket ss = new SocketAddress("127.0.0.1", 21);
当进一步向下时,似乎bad_alloc来自:
IPAddress * ip = new IPAddress("127.0.0.1");
该构造函数包含:(我在调试器中看到_pImpl未初始化)
IPAddress::IPAddress(const std::string& addr)
{
_pImpl = IPv4AddressImpl::parse(addr);
if (!_pImpl) throw InvalidAddressException(addr);
}
IPv4AddressImpl :: parse包含:
static IPv4AddressImpl* parse(const std::string& addr)
{
if (addr.empty()) return 0;
#if defined(_WIN32)
struct in_addr ia;
ia.s_addr = inet_addr(addr.c_str());
if (ia.s_addr == INADDR_NONE && addr != "255.255.255.255")
return 0;
else
return new IPv4AddressImpl(&ia);
#else
#if __GNUC__ < 3
struct in_addr ia;
ia.s_addr = inet_addr(addr.c_str());
if (ia.s_addr == INADDR_NONE && addr != "255.255.255.255")
return 0;
else
return new IPv4AddressImpl(&ia);
#else
struct in_addr ia;
if (inet_aton(addr.c_str(), &ia))
return new IPv4AddressImpl(&ia);
else
return 0;
#endif
#endif
}
以下使用Winsock2.h中的inet_addr(ws2_32.lib)的代码导致“SOMETHING ELSE”。
unsigned long ulAddr = INADDR_NONE;
ulAddr = inet_addr("91.183.48.210");
if (ulAddr == INADDR_NONE)
msg("NONE");
else
msg("SOMETHING ELSE");
我不明白这里出了什么问题......有没有办法进一步调试,或者有人知道出了什么问题?
答案 0 :(得分:1)
我不是火箭科学家,但看起来你必须走进IPv4AddressImpl()
,ia.s_addr
填充了指向字符串"127.0.0.1"
的指针。
只是出于兴趣,当您使用真实IP地址而不是环回时,是否会收到错误。
而且,你在那台机器上运行的是FTP服务器吗?
并且,绝对确定字符串是"127.0.0.1"
?
<强>更新强>
只有三件事可以导致异常。
addr.empty()
为真,如果地址为"127.0.0.1"
则不太可能。is.s_addr
是INADDR_NONE
,再次不太可能,因为inet_addr()
应该没有问题127.0.0.1(正如您测试的那样)。IPv4AddressImpl()
的构造函数返回NULL(或抛出bad_alloc
异常本身)。最后一个似乎最有可能,当你编写自己的代码时会发生什么?
struct in_addr ia;
ia.s_addr = inet_addr("127.0.0.1");
IPv4Address *x = new IPv4AddressImpl(&ia);
此外,如果您在"if (!_pImpl) throw..."
行上断点并检查_pImpl
:
IPAddress()
构造函数抛出bad_alloc
。IPv4AddressImpl()
构造函数。您可以 进入该阶段以进一步调试。
答案 1 :(得分:0)
看起来唯一可能的原因是对
的调用inet_addr
就行了
ia.s_addr = inet_addr(addr.c_str());
返回INADDR_NONE,导致返回0 / NULL,导致抛出异常。
你能调用inet_addr(“127.0.0.1”)并查看结果是什么吗?如果结果是INADDR_NONE,那么你需要找到一个好的地址给inet_addr,让你的系统满意。
以下是MSDN文档中inet_addr的链接。
<强>观察强> 你正在调用构造函数
IPAddress("127.0.0.1");
使用const char *,但构造函数采用const引用
IPAddress::IPAddress(const std::string& str);
编译器足够聪明,可以创建那个临时的吗?我用VS 2003试了一下,看起来没问题。我怀疑语言应该足够智能来处理这个问题,但我想我会指出它。