私は最近ソケット プログラミングを行っており、C++ でコードを書き始めています。私が書こうとしているプログラムには、ソケットを介して通信する必要があるいくつかのコンポーネントがあるため、ソケット通信をクラスでラップすることにしました。
発生する可能性のあるエラーがいくつかあるため、ソケット例外用のクラスを作成することにし、次のように定義しました。
class SocketException: public std::exception {
public:
SocketException(const std::string &message);
~SocketException() throw();
virtual const char * what() const throw();
private:
std::string msg;
};
実装は次のとおりです。
SocketException::SocketException(const std::string &message) : msg(message) {}
SocketException::~SocketException() throw() {}
const char * SocketException::what() const throw() {
std::stringstream stream;
stream << msg + " Error number: ";
stream << WSAGetLastError();
return stream.str().c_str();
}
what()
エラーコードのテキストの意味を表示したいのFormatMessage()
ですが、まだ書いていないため、メソッドの実装は今のところ不完全です。
Visual Studio でこのコードを試していましたが、期待どおりに動作する代わりに、what()
メソッドがガベージを返します。問題の解明にかなりの時間を費やし、さまざまなことを試した後、別のコンパイラを試すことになりました。
MinGW (GCC) を使用すると、コードは期待どおりにコンパイルおよび実行され、メッセージは思ったとおりに表示されます (誰かが興味を持っているconnect()
場合は、インターネットに接続していないときに実行しようとしています)。
私はちょうど C++ を学んでいます。問題がどこにあるのか、それを行う適切な方法は何かを知りたいです。
編集:コメントと回答をありがとう、最初はそうなると思ったのでnew
、ストリームを割り当てていました(リークになることを知っていてもnew
、ヒープを使用していることを理解しているので試してみました)結果は同じ、これは私が持っていたものです:
const char * SocketException::what() const throw() {
std::stringstream *stream = new std::stringstream();
*stream << msg + " Error: ";
*stream << WSAGetLastError();
return (*stream).str().c_str();
}