Как решить эту проблему bad_alloc? - PullRequest
0 голосов
/ 30 апреля 2009

Я разрабатываю приложение, которое должно взаимодействовать по FTP. Для этого общения в настоящее время я использую C ++, Visual Studio и Poco в Windows.

Следующая строка приводит к исключению 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
}

Следующий код с inet_addr из Winsock2.h (ws2_32.lib) приводит к "ЧТО-ТО ЕЩЕ".

unsigned long ulAddr = INADDR_NONE;
ulAddr = inet_addr("91.183.48.210");
if (ulAddr == INADDR_NONE)
    msg("NONE");
else
    msg("SOMETHING ELSE");

Я не вижу, что здесь происходит не так ... Есть ли способ отладить это дальше, или кто-то знает, что идет не так?

Ответы [ 2 ]

1 голос
/ 30 апреля 2009

Я не ученый в области ракетостроения, но похоже, что вам придется войти в 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:

  • ноль означает, что :: parse вернул NULL, а конструктор IPAddress() выдает bad_alloc.
  • ненулевое средство: сам синтаксический анализ вызвал исключение, которое может быть только из конструктора IPv4AddressImpl().

Вы можете иметь , чтобы войти в него для дальнейшей отладки.

0 голосов
/ 30 апреля 2009

Похоже, единственной возможной причиной является звонок на

inet_addr

на линии

ia.s_addr = inet_addr(addr.c_str());

возвращает INADDR_NONE, что приводит к возвращению 0 / NULL, вызывая исключение.

Можете ли вы позвонить inet_addr ("127.0.0.1") и посмотреть, каковы результаты? Если результаты INADDR_NONE, вам нужно найти хороший адрес для inet_addr, который сделает вашу систему счастливой.

Вот ссылка на inet_addr в документации MSDN.

Наблюдение Вы звоните конструктору

 IPAddress("127.0.0.1");

с константным символом *, но конструктор принимает константные ссылки

 IPAddress::IPAddress(const std::string& str);

достаточно ли умен компилятор для создания этого временного? Я попробовал это с VS 2003, и, кажется, все в порядке. Я подозреваю, что язык должен быть достаточно умным, чтобы справиться с этим, но я думал, что укажу на это.

...