이 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 (ws2_32.lib)에서 inet_addr을 사용한 다음 코드는 "다른 것"을 초래합니다.
unsigned long ulAddr = INADDR_NONE;
ulAddr = inet_addr("91.183.48.210");
if (ulAddr == INADDR_NONE)
msg("NONE");
else
msg("SOMETHING ELSE");
나는 여기서 무엇이 잘못되고 있는지 알지 못합니다 ... 이것을 더 이상 디버그하는 방법이 있습니까, 아니면 누군가가 무엇이 잘못되었는지 알고 있습니까?
해결책
나는 로켓 과학자가 아니지만 당신이 들어가야 할 것 같습니다. IPv4AddressImpl()
~와 함께 ia.s_addr
문자열에 대한 포인터로 채워집니다 "127.0.0.1"
.
관심이 없다면 루프백 대신 실제 IP 주소를 사용할 때 오류가 발생합니까?
그리고 해당 컴퓨터에서 FTP 서버가 실행 중입니까?
그리고 당신은 물론 확실한 문자열이 있습니다 "127.0.0.1"
?
업데이트:
예외를 일으킬 수있는 세 가지만 있습니다.
addr.empty()
Addr이라면 사실입니다"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
:
- Zero는 :: 구문 분석을 의미합니다.
IPAddress()
생성자 던지기bad_alloc
. - 0이 아닌 수단 :: 구문 분석 자체는
IPv4AddressImpl()
건설자.
당신은 할 수있다 가지다 더 이상 디버그를하기 위해.
다른 팁
유일한 원인은
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");
const char*가 있지만 생성자는 const 참조를 취합니다.
IPAddress::IPAddress(const std::string& str);
컴파일러가 임시를 만들기에 충분히 스마트합니까? 나는 VS 2003에서 그것을 시도했지만 괜찮은 것 같습니다. 나는 언어가 이것을 처리하기에 충분히 똑똑해야한다고 생각하지만, 나는 그것을 지적 할 것이라고 생각했다.