如何解决这个bad_alloc问题?

时间:2009-04-30 13:42:28

标签: c++ poco bad-alloc

我正在开发一个需要通过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");

我不明白这里出了什么问题......有没有办法进一步调试,或者有人知道出了什么问题?

2 个答案:

答案 0 :(得分:1)

我不是火箭科学家,但看起来你必须走进IPv4AddressImpl()ia.s_addr填充了指向字符串"127.0.0.1"的指针。

只是出于兴趣,当您使用真实IP地址而不是环回时,是否会收到错误。

而且,你在那台机器上运行的是FTP服务器吗?

并且,绝对确定字符串是"127.0.0.1"

<强>更新

只有三件事可以导致异常。

  • addr.empty()为真,如果地址为"127.0.0.1"则不太可能。
  • is.s_addrINADDR_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

  • 零表示:: parse返回NULL,而IPAddress()构造函数抛出bad_alloc
  • 非零意味着:: parse本身抛出的异常只能来自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试了一下,看起来没问题。我怀疑语言应该足够智能来处理这个问题,但我想我会指出它。