2009-04-30 33 views
0

私はFTPを介して対話する必要があるアプリケーションを開発しています。このコミュニケーションのために、私は現在Windows上でC++、Visual Studio、Pocoを使用しています。さらに下って行くときこのbad_alloc問題を解決するには?

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"); 

このコンストラクタは次のものを含んでいます:(I _pImplが初期化されていないデバッガ)

IPAddress::IPAddress(const std::string& addr) 
{ 
_pImpl = IPv4AddressImpl::parse(addr); 

if (!_pImpl) throw InvalidAddressException(addr); 
} 

IPv4AddressImplは::解析が含まれている中で参照してください。

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"); 

私は何が間違ってここに起こっているが表示されない...これはさらなるまたは誰かがうまくいかないのか分からないデバッグする方法はありますか?

+0

"_pimplが初期化されていません"と言うと、IPAddressコンストラクタで値が0に割り当てられているということですか? –

+0

ip = 0xcccccc {_pImpl = ??? } CXX0076:エラー: –

+0

_pImplの式を評価できません。したがって、おそらく初期化されていません。 –

答えて

1

私はロケット科学者ではありませんが、IPv4AddressImpl()に入り、ia.s_addr"127.0.0.1"という文字列へのポインタが入力されている必要があります。

ループバックの代わりに実際のIPアドレスを使用するとエラーが発生しますか。

また、そのマシンでFTPサーバーを実行していますか?

そして、あなたはとなりますか?特定の文字列は"127.0.0.1"ですか?

更新:

例外を引き起こす可能性がありますだけは本当に三つあります。

  • addr.empty()がtrueです.addrが"127.0.0.1"の場合はありそうもありません。
  • is.s_addrINADDR_NONEですが、inet_addr()は127.0.0.1(テストしたように)の問題がないため、これもありません。
  • IPv4AddressImpl()のコンストラクタはNULLを返します(またはbad_alloc例外自体をスローします)。

最後の1つは最も可能性が高いと思われます。自分でコードを記述するとどうなりますか?また

struct in_addr ia; 
ia.s_addr = inet_addr("127.0.0.1"); 
IPv4Address *x = new IPv4AddressImpl(&ia); 

、あなたが"if (!_pImpl) throw..."行にブレークポイントを設定して_pImplを調べる場合:

  • ゼロは:: NULL返さパースを意味し、それはbad_allocを投げIPAddress()コンストラクタです。
  • 0以外の意味:: :: parse自体は例外を投げました。これはIPv4AddressImpl()コンストラクタからのみ可能です。

を持っていて、さらにデバッグすることができます。

+0

これらはコンパイルされたライブラリなので、コードにステップインできません。どんなIPでも(インターネット、ドメイン名、ローカル)、それらはすべて同じ結果になります。そして、はい、インターネット上の私のPCとサーバーの両方で動作するFTPサーバーがあります。これは実際にはIPAddressのメーザーではありません。 –

+0

いいえ、FTPサーバーは長時間の撮影でした。しかし、ソースを見ることができれば、デバッグモードで再コンパイルして、そのソースに入ることができないのはなぜですか? – paxdiablo

+0

問題は、デバッグモードでこの問題が発生しないということでした... –

0

それが唯一の原因のように見えるがライン上

inet_addr 

への呼び出しに例外がスローされる原因と、0/NULLが返されることになり

ia.s_addr = inet_addr(addr.c_str()); 

返しINADDR_NONEです。

inet_addr( "127.0.0.1")を呼び出して結果を確認できますか?結果がINADDR_NONEの場合は、システムを幸せにする良いアドレスをinet_addrに見つける必要があります。

ここにMSDNのドキュメントのinet_addrへのリンクがあります。

観察 あなたはのconstのchar *とコンストラクタ

IPAddress("127.0.0.1"); 

を呼び出しているが、コンストラクタは

IPAddress::IPAddress(const std::string& str); 

constの参照を取るには、その一時的を作成するのに十分賢いコンパイラのですか?私はVS 2003で試してみました。それは大丈夫です。私は言語がこれを扱うのに十分にスマートでなければならないと思うが、私はそれを指摘したいと思った。

+0

それは私の最初の考えですが、inet_addrは非常に単純な関数であり、 "127.0.0.1"には問題はありません。 – paxdiablo

+0

WinSock2.h、ws2_32.lib、inet_addr実際には良いアドレスになります。 –

+0

リファレンスへの変換に関しては、コンパイラは十分にスマートです - これはC++の非常に一般的なイディオムです。 –

関連する問題