C++ プログラムの 1 つに非常に大きな奇妙な問題があります (ソース コードはこちら: https://github.com/dermesser/libsocket )。
まず、それに関するいくつかの詳細: 基本クラス (C++/socket.cpp のソケット)、(仮想) 派生クラス (C++/unixbase.cpp の unix_socket)、および「リーフ」クラス (unix_stream_server) があります。データメンバ「sfd」は、「socket」(socket.cpp) で宣言および初期化されます。しかし、unix_stream_server::setup (C++/unixserverstream.cpp) では、「sfd」がまったく異なる値になっています。少しデバッグ出力:
socket constr -1 # <--- "socket" constructor
unix_socket constr - sfd: 1447345536 # <---- unix_socket constructor
setup final: 1447345536 # <--- unix_stream_server::setup
unixserverstream.cpp:76: unix_stream_server::setup: Socket already set up!
最後の行は、例外によって渡されたエラー メッセージです。プログラムをデバッグしても同じ結果が得られます。
奇妙なことに、変数の値が大きく変化し、その理由がわかりません。また、同様の継承パスを持つ兄弟クラスでは、この問題は存在しません。
編集1:「sfd」を再割り当てしても問題は消えません。それは単に同じ奇妙な値のままです。
私が解決したいくつかの問題と私が試したこと:
- 定義/宣言の不一致 (私は知っていますが、これはこのソフトウェアでは非常に奇妙です)
- パブリックエリアに「sfd」を配置する
問題になる可能性があること: プログラム (examples++/unix_server_stream.cpp) を静的または動的に (Makefile によって生成された SO に対して) リンクすると、問題が発生します。
私は必死です:(誰かがそのような問題についてアイデアや経験を持っていますか?それとも私は疲れすぎて解決策を見つけることができませんか?
編集 2: コードを投稿するのは難しいです。どの部分を投稿すればいいのかわからないので、githubリポジトリのファイルへのヒントに従ってください。:| 申し訳ありません... (そして、私があなたに働いてほしいとは思わないでください - 正しいコードを選択するのは難しいだけです)
unix_stream_server::setup():
if ( sfd != -1 )
throw socket_exception(__FILE__,__LINE__,"unix_stream_server::setup: Socket already set up!\n");
if ( path == NULL )
throw socket_exception(__FILE__,__LINE__,"unix_stream_server::setup: Path is NULL!\n");
sfd = create_unix_server_socket(path,STREAM,flags);
_path.assign(path);
if ( sfd < 0 )
throw socket_exception(__FILE__,__LINE__,"unix_stream_server::setup: Error at creating UNIX stream server socket!\n");