1

良い一日をお過ごしください。

私は Berkley C Networking API をラップするクラスに取り組んでいますが、これまでのところ、TCP サーバー/クライアントしか動作していません。

皮肉なことに、私が抱えている問題はネットワーキングではなく、スタックとヒープにあります。おそらく私はそれを完全には理解していませんが、次のようなものを使用すると ClientSocket *mysock = new ClientSocket(); 、 -> 演算子を使用して関数を呼び出すだけで、完全に正常に動作します-エラーが発生した場合、私の SocketException クラスは問題なくキャッチされます。

しかし、私が使用すると: ClientSocket mysock; そして、を使用して関数を呼び出すときに例外がスローされます。オペレーター、それは示しています: terminate called after throwing an instance of 'SocketException' Aborted そして、端末プロンプトに戻ります。

追加するのを忘れていましたが、呼び出しを try/catch ブロックでラップしています。

最初の例は「new」キーワードを使用してヒープ上の新しい ClientSocket インスタンスへのポインターを返し、2 番目の例はスタック用であることは承知していますが、問題はわかりません。

ポインター/参照/スタック/ヒープについて何かが足りないと思っていますが、何が起こっているのかわかりません。多くの場合、コードは問題なく実行されますが、例外がスローされた場合.... >:(

編集: リンク ページでは、Client.cxx と Server.cxx がサンプル ファイルです。ご指摘ありがとうございます、エリック。これを手伝っていただければ幸いです。このプロジェクトのソースは次の場所
にあります: すべてのファイルへのリンク: http://furryhead.co.cc/problem.html
(2 つ以上のリンクを貼り付けることができませんでした。また、4 つのファイルがあるため、これを行う必要があります。誰かが私の投稿にリンクをマージできます) 注意: Socket.cxx はかなり大きく、ServerSocket、ClientSocket、および SocketException の定義が含まれています。

上記のすべてのファイルをコンパイルするコマンドは次のとおりです。
g++ -c Socket.cxx -o Socket.o
g++ -c Server.cxx -o Server.o
g++ -c Client.cxx -o Client.o
g++ Server.o Socket.o -o サーバー
g++ クライアント.o ソケット.o -o クライアント

ありがとう!

Jon の推奨に従って、ソケット関数のドキュメントを調べたところ、エラー レポートが改善されました。'errno' 変数をチェックし、それに基づいて例外をスローします。(それと、ノンブロッキングに設定していません... ;) ) - 更新して感謝したかっただけです! :D

4

2 に答える 2

7

私には、これは正当な理由で例外がスローされ、スタックの巻き戻し中に一部のオブジェクト (おそらくClientSocket's?) のデストラクタがスローされるように思えます。ランタイムはこの状況を意味のある方法で解決できないため (2 つの例外が同時に「スロー」される)、terminate関数が呼び出され、プログラムがシャットダウンされます。

未回答の質問は、それが属するオブジェクトがスタックに割り当てられている場合、一部のデストラクタがスローする理由です。しかし、この質問に答えるには、より多くのデータが必要です。もう少し深く掘り下げて、私の仮説を検証していただけないでしょうか?

ちなみに、これが事実であり、デストラクタが何かをスローすること はないため、問題のクラスには致命的な欠陥があると結論付けることができます。

更新:私はお金を稼いでいたようです。

あなたのクラスSocketのデストラクタは を呼び出しclosecloseスローすることができます。これは重大なプログラミング エラーです。closeデストラクタで呼び出しをラップする必要があります

try {
    close();
}
catch(...)
{ /* this space intentionally left blank */ }

そしてクラッシュはなくなります。

2 回目の更新 (もうクラッシュしません)

が -1 を返す場合recv、これはソケットが非ブロッキング モードであり、現在受信できるデータがないことを意味します。これはエラーではなく、機能です。そこで例外をスローするべきではありません。正確に何をすべきかは、ソケットをブロッキングモードで使用するか、非ブロッキングモードで使用するかによって異なります。

于 2011-03-13T00:03:47.303 に答える
0

Jon は既に終了の問題を解決していますが、元のコードには別の問題があります。

動的に割り当てられたオブジェクトが機能しているように見える理由は、他の場所で例外が発生した場合にリークされ、デストラクタが呼び出されないためです。これにより二重例外の問題は回避されますが、後で別のセットが発生します...

于 2011-03-13T08:00:46.513 に答える