簡體   English   中英

如何解決這個bad_alloc問題?

[英]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_addrINADDR_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

  • 零表示:: parse返回NULL,它是IPAddress()構造函數拋出bad_alloc
  • 非零表示:: parse本身引發了一個異常,該異常只能來自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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM