編集:オペレーターが問題ではなかったので、タイトルはほとんど問題にならなかったので、タイトルを変更しました。new
以前のタイトルは「オペレーターの新しい失敗はありますか?」でした。
以下のコードでは、クライアントがサーバーに接続する前に、新しい Socket オブジェクト ポインターを作成します。クライアントが接続すると、 でオブジェクトを作成しますnew
。しかし、どういうわけか、デバッガー (Eclipse CDT、g++ Ubuntu/Linaro 4.6.3-1ubuntu5) でコードをステップ実行すると、new
オペレーターの呼び出し後、ポインターがまだ NULL ではないことがわかります。
class Socket
{
public:
Socket( int domain, int type, int protocol = 0 );
~Socket();
[...]
int accept( Socket * socket );
[...]
private:
Socket();
int mSocketDescriptor;
int mNetworkProtocol;
int mTransportProtocol;
};
[...]
int Socket::accept( Socket * socket )
{
// Accept one connection (blocking)
struct sockaddr_in cli_addr;
socklen_t clilen = sizeof(cli_addr);
int ret = ::accept(mSocketDescriptor, (struct sockaddr *) &cli_addr, &clilen);
if ( ret >= 0 ){
socket = new Socket(); // <- Here's the problem, socket remains NULL
socket->mSocketDescriptor = ret;
socket->mNetworkProtocol = this->mNetworkProtocol;
socket->mTransportProtocol = this->mTransportProtocol;
}
return ret;
}
メインループ:
// Accept all incoming connections in a loop
while(true){
// Accept one connection (blocking)
net::Socket * newConn = NULL;
if (socket.accept(newConn) < 0){
perror("accept()");
exit(EXIT_FAILURE);}
// Create a new thread that is talking to the client
pthread_t nThreadID;
pthread_create(&nThreadID, NULL, ClientMainThreadProc, newConn);
}
C++ リファレンスを読みました。失敗した場合、bad_alloc 例外が発生する必要があることがわかりnew
ます。しかし、それは事実ではないので、何がうまくいかないのかわかりません。助言がありますか?