Wie beheben ich dieses bad_alloc -Problem?
Frage
Ich entwickle eine Anwendung, die über FTP interagieren muss. Für diese Kommunikation verwende ich derzeit C ++, Visual Studio und POCO unter Windows.
Die folgende Zeile führt zu einer bad_alloc -Ausnahme ...
ftp = new FTPClientSession("127.0.0.1", 21);
Also ging ich runter und versuchte zuerst ein Streamsocket, scheitert auch ...
StreamSocket ss = new SocketAddress("127.0.0.1", 21);
Wenn Sie noch weiter nach unten gehen, scheint der Bad_alloc von:
IPAddress * ip = new IPAddress("127.0.0.1");
Dieser Konstruktor enthält: (Ich sehe im Debugger, dass _pimpl nicht initialisiert wird)
IPAddress::IPAddress(const std::string& addr)
{
_pImpl = IPv4AddressImpl::parse(addr);
if (!_pImpl) throw InvalidAddressException(addr);
}
IPv4AddressImpl :: Parse enthält:
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
}
Der folgende Code mit INET_ADDR von Winsock2.h (WS2_32.lib) führt zu "etwas anderem".
unsigned long ulAddr = INADDR_NONE;
ulAddr = inet_addr("91.183.48.210");
if (ulAddr == INADDR_NONE)
msg("NONE");
else
msg("SOMETHING ELSE");
Ich sehe nicht, was hier schief geht ... Gibt es eine Möglichkeit, dies weiter zu debuggen, oder weiß jemand, was schief geht?
Lösung
Ich bin kein Raketenwissenschaftler, aber es sieht so aus, als müssten Sie eintreten IPv4AddressImpl()
mit ia.s_addr
mit einem Zeiger auf die Zeichenfolge besiedelt "127.0.0.1"
.
Erhalten Sie den Fehler, wenn Sie Ihre reale IP -Adresse anstelle des Loopbacks verwenden.
Und haben Sie einen FTP -Server auf diesem Computer?
Und bist du unbedingt sicher die Zeichenfolge ist "127.0.0.1"
?
Aktualisieren:
Es gibt nur drei Dinge, die die Ausnahme hervorrufen können.
addr.empty()
ist wahr, unwahrscheinlich, wenn ADDR ist"127.0.0.1"
.is.s_addr
istINADDR_NONE
, seitdem wieder unwahrscheinlichinet_addr()
sollte keine Probleme mit 127.0.0.1 haben (wie Sie getestet haben).- der Konstruktor für
IPv4AddressImpl()
Gibt NULL zurück (oder wirft diebad_alloc
Ausnahme selbst).
Das letzte scheint am wahrscheinlichsten zu sein. Was passiert, wenn Sie Ihren eigenen Code schreiben, um dies zu tun?
struct in_addr ia;
ia.s_addr = inet_addr("127.0.0.1");
IPv4Address *x = new IPv4AddressImpl(&ia);
Außerdem, wenn Sie Breakpoint auf der "if (!_pImpl) throw..."
Linie und untersuchen _pImpl
:
- Null bedeutet das :: parse zurückgegeben null und es ist das ist das
IPAddress()
Konstruktor werfenbad_alloc
. - ungleich Null bedeutet :: Parse selbst warf eine Ausnahme, die nur aus dem ausgehen konnte
IPv4AddressImpl()
Konstrukteur.
Du könntest haben Um weiter zu debuggen, um weiter zu debuggen.
Andere Tipps
Es sieht so aus, als wäre die einzig mögliche Ursache der Anruf an
inet_addr
an der Leitung
ia.s_addr = inet_addr(addr.c_str());
Gibt inaDDR_None zurück, was dazu führt, dass 0/Null zurückgegeben wird, was die Ausnahme ausgelöst hat.
Können Sie inet_addr ("127.0.0.1") nennen und sehen, was die Ergebnisse sind? Wenn die Ergebnisse inaDDR_None sind, müssen Sie eine gute Adresse zu Inet_ADDR finden, die Ihr System glücklich macht.
Hier ist ein Link zu INET_ADDR In der MSDN -Dokumentation.
ÜberwachungSie rufen den Konstruktor an
IPAddress("127.0.0.1");
mit einem const char*, aber der Konstruktor nimmt eine konstante Referenzen
IPAddress::IPAddress(const std::string& str);
Ist der Compiler intelligent genug, um das vorübergehend zu erstellen? Ich habe es mit VS 2003 ausprobiert, und es scheint in Ordnung zu sein. Ich vermute, dass die Sprache klug genug sein sollte, um damit umzugehen, aber ich dachte, ich würde darauf hinweisen.