아래와 같이 소켓이 생성될때 소켓을 복사해주고 소멸시킬때 close 해줄 때 임시변수는 큰 문제가 된다.
CClientSocket::CClientSocket( SOCKET client )
: m_client( client )
{
}
CClientSocket::~CClientSocket(void)
{
Disconnect();
}
void CClientSocket::Disconnect()
{
if( m_client == INVALID_SOCKET )
return;
closesocket( m_client );
m_client = INVALID_SOCKET;
}
소멸자에서 특정 포인터를 닫을 경우엔 조심 또 조심하자. 임시변수가 생성되도 소멸자가 호출되니깐.!!
CClientSocket::CClientSocket( SOCKET client )
: m_client( client )
{
}
CClientSocket::~CClientSocket(void)
{
Disconnect();
}
void CClientSocket::Disconnect()
{
if( m_client == INVALID_SOCKET )
return;
closesocket( m_client );
m_client = INVALID_SOCKET;
}
vector<CClientSocket> g_Clients;
SOCKET client = server.Accept(&clientInfo);
assert( client != INVALID_SOCKET );
g_Clients.push_back( client );
=> push_back 할때 임시 변수가 생성되는데 이때 생성자가 또 호출되게 된다. 그리고 사라진다.
이것이 문제다. client는 서로간의 참조관계가 되므로 같이 죽게 된다. client는 SOCKET이고 g_Clients는 CClientSocket 이므로 암시적인 형변환이라고 해야하나 이를 위해 임시변수가 생성되는것이다.
vector<SOCKET> g_Clients;
=> 그런데 SOCKET으로 한다면 죽지 않는다. 임시변수를 생성하지 않아서 그런거 같은데 -_-.. 모르겠다.
SOCKET client = server.Accept(&clientInfo);
assert( client != INVALID_SOCKET );
g_Clients.push_back( client );
=> push_back 할때 임시 변수가 생성되는데 이때 생성자가 또 호출되게 된다. 그리고 사라진다.
이것이 문제다. client는 서로간의 참조관계가 되므로 같이 죽게 된다. client는 SOCKET이고 g_Clients는 CClientSocket 이므로 암시적인 형변환이라고 해야하나 이를 위해 임시변수가 생성되는것이다.
vector<SOCKET> g_Clients;
=> 그런데 SOCKET으로 한다면 죽지 않는다. 임시변수를 생성하지 않아서 그런거 같은데 -_-.. 모르겠다.
소멸자에서 특정 포인터를 닫을 경우엔 조심 또 조심하자. 임시변수가 생성되도 소멸자가 호출되니깐.!!
Tag | 에러