[英]How to resolve this bad_alloc problem?
我正在開發一個需要通過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的以下代碼將導致“ SOMETHING ELSE”。
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"
的指針的IPv4AddressImpl()
。
只是出於興趣,使用真實IP地址而不是環回時會收到錯誤消息。
而且,您是否在該計算機上運行了FTP服務器?
並且,您絕對確定字符串是"127.0.0.1"
嗎?
更新:
確實只有三件事會導致異常。
addr.empty()
為true,如果addr為"127.0.0.1"
則不太可能。 is.s_addr
為INADDR_NONE
,再次不太可能,因為INADDR_NONE
inet_addr()
應該對127.0.0.1 INADDR_NONE
(如您所測試的)。 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
:
IPAddress()
構造函數拋出bad_alloc
。 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找到一個合適的地址,以使您的系統滿意。
這是MSDN文檔中指向inet_addr的鏈接。
觀察您正在調用構造函數
IPAddress("127.0.0.1");
帶有const char *,但構造函數采用const引用
IPAddress::IPAddress(const std::string& str);
編譯器足夠聰明以創建該臨時文件嗎? 我用VS 2003進行了嘗試,似乎還可以。 我懷疑這種語言應該足夠聰明,可以解決這個問題,但是我想指出一點。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.