Como resolver esse problema bad_alloc?
Pergunta
Estou desenvolvendo um aplicativo que precisa interagir sobre o FTP. Para esta comunicação, atualmente estou usando C ++, Visual Studio e Poco no Windows.
A linha a seguir resulta em uma exceção bad_alloc ...
ftp = new FTPClientSession("127.0.0.1", 21);
Então eu caí e tentei inicializar primeiro um streambocket, também falha ...
StreamSocket ss = new SocketAddress("127.0.0.1", 21);
Ao ir ainda mais abaixo, e parece que o Bad_Alloc vem de:
IPAddress * ip = new IPAddress("127.0.0.1");
Esse construtor contém: (vejo no depurador que _pimpl não é inicializado)
IPAddress::IPAddress(const std::string& addr)
{
_pImpl = IPv4AddressImpl::parse(addr);
if (!_pImpl) throw InvalidAddressException(addr);
}
Ipv4addressimpl :: parse contém:
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
}
O código a seguir com Inet_ADDR de Winsock2.h (WS2_32.lib) resulta em "outra coisa".
unsigned long ulAddr = INADDR_NONE;
ulAddr = inet_addr("91.183.48.210");
if (ulAddr == INADDR_NONE)
msg("NONE");
else
msg("SOMETHING ELSE");
Não vejo o que está dando errado aqui ... Existe uma maneira de depurar isso mais ou alguém sabe o que dá errado?
Solução
Não sou cientista de foguetes, mas parece que você precisa entrar IPv4AddressImpl()
com ia.s_addr
preenchido com um ponteiro para a corda "127.0.0.1"
.
Apenas fora de interesse, você recebe o erro ao usar seu endereço IP real em vez do loopback.
E você tem um servidor FTP em execução nessa máquina?
E você é absolutamente Certamente a string é "127.0.0.1"
?
Atualizar:
Há apenas três coisas que podem causar a exceção.
addr.empty()
é verdade, improvável se Addr for"127.0.0.1"
.is.s_addr
éINADDR_NONE
, novamente improvável desdeinet_addr()
não deve ter problemas com 127.0.0.1 (como você testou).- o construtor para
IPv4AddressImpl()
retorna nulo (ou joga obad_alloc
exceção em si).
Esse último parece o mais provável, o que acontece quando você escreve seu próprio código para fazê -lo?
struct in_addr ia;
ia.s_addr = inet_addr("127.0.0.1");
IPv4Address *x = new IPv4AddressImpl(&ia);
Além disso, se você quebrar o ponto de interrupção no "if (!_pImpl) throw..."
linha e examinar _pImpl
:
- Zero significa que o :: parse retornou nulo e é o
IPAddress()
lançamento do construtorbad_alloc
. - diferente de zero significa :: parse em si jogou uma exceção que só poderia ser do
IPv4AddressImpl()
construtor.
Você pode tenho Para entrar nisso para depurar mais.
Outras dicas
Parece que a única causa possível é a chamada para
inet_addr
na linha
ia.s_addr = inet_addr(addr.c_str());
Retorna inaddr_none, o que faz com que 0/nulo seja devolvido, fazendo com que a exceção seja lançada.
Você pode ligar para o INT_ADDR ("127.0.0.1") e ver quais são os resultados? Se os resultados forem inaddr_none, você precisará encontrar um bom endereço para INT_ADDR que faça seu sistema feliz.
Aqui está um link para INT_ADDR na documentação do MSDN.
ObservaçãoVocê está chamando o construtor
IPAddress("127.0.0.1");
com um const char*, mas o construtor faz referências const
IPAddress::IPAddress(const std::string& str);
O compilador é inteligente o suficiente para criar isso temporário? Eu tentei com o VS 2003, e parece estar bem. Suspeito que o idioma seja inteligente o suficiente para lidar com isso, mas pensei em apontar.